如何用定长数组存放不定个数的数据并避免空指针异常?

  1. 问题:用一个定长数组存放学生信息,并且能输出学生信息
  2. 注意:如果定长数组没存满,遍历的时候就会出现空指针异常,如何避免呢?
  3. 解决办法:控制循环条件,不完全遍历,只遍历值不为空的情况,添加数据的时候,记录添加次数,作为循环遍历的次数
  4. 代码如下:
  5. ***********************工人类************************
  6. package com.xtkj.javaProgram;
  7. import java.util.Scanner;
  8. public class Worker {
  9. private int id;
  10. private String name;
  11. private int age;
  12. private double salary;
  13. Worker(){
  14. this.id = id;
  15. this.name = name;
  16. this.age = age;
  17. this.salary = salary;
  18. }
  19. public int getId() {
  20. return id;
  21. }
  22. public void setId(int id) {
  23. this.id = id;
  24. }
  25. public String getName() {
  26. return name;
  27. }
  28. public void setName(String name) {
  29. this.name = name;
  30. }
  31. public int getAge() {
  32. return age;
  33. }
  34. public void setAge(int age) {
  35. this.age = age;
  36. }
  37. public double getSalary() {
  38. return salary;
  39. }
  40. public void setSalary(double salary) {
  41. this.salary = salary;
  42. }
  43. }
  44. ********************************方法类******************************
  45. package com.xtkj.javaProgram;
  46. import java.util.Scanner;
  47. public class Do {
  48. Worker []a=new Worker[50];// 定义一个Worker类型的数组,长度为50
  49. int i=0;//在方法外部 定义一个变量,记录添加的次数
  50. int notexist=0;
  51. Scanner sc=new Scanner(System.in );
  52. //添加
  53. void add(){
  54. System.out.println("请输入新员工的员工号、姓名、年龄和工资:");
  55. Worker wr=new Worker();
  56. a[i]=wr;//每一次添加都实例化一个对象,并以把对象存入到数组a中
  57. int id=sc.nextInt();
  58. a[i].setId(id);
  59. String name=sc.next();
  60. a[i].setName(name);
  61. int age=sc.nextInt();
  62. a[i].setAge(age);
  63. double salary=sc.nextDouble();
  64. a[i].setSalary(salary);
  65. System.out.println("**********添加成功***********");
  66. i++;//做标记,记录数组下标
  67. }
  68. //按员工号查询
  69. void find(){
  70. System.out.println("请输入员工的员工号:");
  71. int id=sc.nextInt();
  72. for(int j=0;j<i;j++){
  73. if(a[j].getId()==id){
  74. System.out.println("所查员工信息为:");
  75. System.out.println("员工号:"+a[j].getId()+" 姓名:"+a[j].getName()
  76. +" 年龄:"+a[j].getAge()+" 工资"+a[j].getSalary());
  77. notexist=1;
  78. }
  79. }
  80. if(notexist!=1){
  81. System.out.println("查无此人");
  82. }
  83. }
  84. //显示所有员工信息
  85. void showAll(){
  86. System.out.println("员工的员工号、姓名、年龄和工资如下:");
  87. for(int j=0;j<i;j++){//循环次数以数组啊[i]de 下标为准,不是数组长度,否则会空指针异常
  88. System.out.println("员工号:"+a[j].getId()+" 姓名:"+a[j].getName()
  89. +" 年龄:"+a[j].getAge()+" 工资"+a[j].getSalary());
  90. }
  91. }
  92. //修改薪水
  93. void updatesal(){
  94. System.out.println("请输入要修改的员工的员工号和修改之后的工资:");
  95. int id=sc.nextInt();
  96. double salary=sc.nextDouble();
  97. for(int j=0;j<i;j++){
  98. if(a[j].getId()==id){
  99. System.out.println("该员工信息为:");
  100. System.out.println("员工号:"+a[j].getId()+" 姓名:"+a[j].getName()
  101. +" 年龄:"+a[j].getAge()+" 工资"+a[j].getSalary());
  102. notexist=1;
  103. a[j].setSalary(salary);
  104. System.out.println("修改后员工信息为:");
  105. System.out.println("员工号:"+a[j].getId()+" 姓名:"+a[j].getName()
  106. +" 年龄:"+a[j].getAge()+" 工资"+a[j].getSalary());
  107. }
  108. }
  109. if(notexist!=1){
  110. System.out.println("查无此人");
  111. }
  112. System.out.println("******************************修改成功!*******************************");
  113. }
  114. *****************************主类************************************************************
  115. public class Main {
  116. public static void main(String[] args) {
  117. Do d=new Do();
  118. boolean b=true;
  119. while(b){//通过while循环,控制循环条件一直为true,每次switch语句跳出后,都立刻回到主菜单
  120. System.out.println("*********************欢迎进入职员薪水管理系统***********************");
  121. System.out.println("请选择以下操作:");
  122. System.out.println("1.添加新员工");
  123. System.out.println("2.查询员工信息");
  124. System.out.println("3.显示所有员工信息");
  125. System.out.println("4.修改员工薪水");
  126. Scanner reader=new Scanner(System.in );
  127. int choice=reader.nextInt();
  128. switch(choice){
  129. case 1:
  130. d.add();
  131. break;
  132. case 2:{
  133. d.find();
  134. }
  135. break;
  136. case 3:
  137. d.showAll();
  138. break;
  139. case 4:
  140. d.updatesal();
  141. break;
  142. default:{
  143. System.out.println("您的输入有误,请从新输入:");
  144. }
  145. }
  146. }
  147. }
  148. }
posted on 2015-08-22 00:28  临界  阅读(570)  评论(0编辑  收藏  举报