如何用定长数组存放不定个数的数据并避免空指针异常?
- 问题:用一个定长数组存放学生信息,并且能输出学生信息
 - 注意:如果定长数组没存满,遍历的时候就会出现空指针异常,如何避免呢?
 - 解决办法:控制循环条件,不完全遍历,只遍历值不为空的情况,添加数据的时候,记录添加次数,作为循环遍历的次数
 - 代码如下:
 - ***********************工人类************************
 - package com.xtkj.javaProgram;
 - import java.util.Scanner;
 - public class Worker {
 - private int id;
 - private String name;
 - private int age;
 - private double salary;
 - Worker(){
 - this.id = id;
 - this.name = name;
 - this.age = age;
 - this.salary = salary;
 - }
 - public int getId() {
 - return id;
 - }
 - public void setId(int id) {
 - this.id = id;
 - }
 - public String getName() {
 - return name;
 - }
 - public void setName(String name) {
 - this.name = name;
 - }
 - public int getAge() {
 - return age;
 - }
 - public void setAge(int age) {
 - this.age = age;
 - }
 - public double getSalary() {
 - return salary;
 - }
 - public void setSalary(double salary) {
 - this.salary = salary;
 - }
 - }
 - ********************************方法类******************************
 - package com.xtkj.javaProgram;
 - import java.util.Scanner;
 - public class Do {
 - Worker []a=new Worker[50];// 定义一个Worker类型的数组,长度为50
 - int i=0;//在方法外部 定义一个变量,记录添加的次数
 - int notexist=0;
 - Scanner sc=new Scanner(System.in );
 - //添加
 - void add(){
 - System.out.println("请输入新员工的员工号、姓名、年龄和工资:");
 - Worker wr=new Worker();
 - a[i]=wr;//每一次添加都实例化一个对象,并以把对象存入到数组a中
 - int id=sc.nextInt();
 - a[i].setId(id);
 - String name=sc.next();
 - a[i].setName(name);
 - int age=sc.nextInt();
 - a[i].setAge(age);
 - double salary=sc.nextDouble();
 - a[i].setSalary(salary);
 - System.out.println("**********添加成功***********");
 - i++;//做标记,记录数组下标
 - }
 - //按员工号查询
 - void find(){
 - System.out.println("请输入员工的员工号:");
 - int id=sc.nextInt();
 - for(int j=0;j<i;j++){
 - if(a[j].getId()==id){
 - System.out.println("所查员工信息为:");
 - System.out.println("员工号:"+a[j].getId()+" 姓名:"+a[j].getName()
 - +" 年龄:"+a[j].getAge()+" 工资"+a[j].getSalary());
 - notexist=1;
 - }
 - }
 - if(notexist!=1){
 - System.out.println("查无此人");
 - }
 - }
 - //显示所有员工信息
 - void showAll(){
 - System.out.println("员工的员工号、姓名、年龄和工资如下:");
 - for(int j=0;j<i;j++){//循环次数以数组啊[i]de 下标为准,不是数组长度,否则会空指针异常
 - System.out.println("员工号:"+a[j].getId()+" 姓名:"+a[j].getName()
 - +" 年龄:"+a[j].getAge()+" 工资"+a[j].getSalary());
 - }
 - }
 - //修改薪水
 - void updatesal(){
 - System.out.println("请输入要修改的员工的员工号和修改之后的工资:");
 - int id=sc.nextInt();
 - double salary=sc.nextDouble();
 - for(int j=0;j<i;j++){
 - if(a[j].getId()==id){
 - System.out.println("该员工信息为:");
 - System.out.println("员工号:"+a[j].getId()+" 姓名:"+a[j].getName()
 - +" 年龄:"+a[j].getAge()+" 工资"+a[j].getSalary());
 - notexist=1;
 - a[j].setSalary(salary);
 - System.out.println("修改后员工信息为:");
 - System.out.println("员工号:"+a[j].getId()+" 姓名:"+a[j].getName()
 - +" 年龄:"+a[j].getAge()+" 工资"+a[j].getSalary());
 - }
 - }
 - if(notexist!=1){
 - System.out.println("查无此人");
 - }
 - System.out.println("******************************修改成功!*******************************");
 - }
 - *****************************主类************************************************************
 - public class Main {
 - public static void main(String[] args) {
 - Do d=new Do();
 - boolean b=true;
 - while(b){//通过while循环,控制循环条件一直为true,每次switch语句跳出后,都立刻回到主菜单
 - System.out.println("*********************欢迎进入职员薪水管理系统***********************");
 - System.out.println("请选择以下操作:");
 - System.out.println("1.添加新员工");
 - System.out.println("2.查询员工信息");
 - System.out.println("3.显示所有员工信息");
 - System.out.println("4.修改员工薪水");
 - Scanner reader=new Scanner(System.in );
 - int choice=reader.nextInt();
 - switch(choice){
 - case 1:
 - d.add();
 - break;
 - case 2:{
 - d.find();
 - }
 - break;
 - case 3:
 - d.showAll();
 - break;
 - case 4:
 - d.updatesal();
 - break;
 - default:{
 - System.out.println("您的输入有误,请从新输入:");
 - }
 - }
 - }
 - }
 - }
 
    好记性不如烂键盘
                    
                
                
            
        
浙公网安备 33010602011771号