为NullPointerException异常

问题描述:

仍然有错误我试图调整here这里,但仍然出来的错误。 错误是当我想要做一些与数组内的元素或者要显示它,存储元素或使用索引搜索 。这里是我的代码:为NullPointerException异常

import java.util.*; 
public class RegisterMenu { 
    private Driver[] newOwner; //array 
    private final int MAX_ITEMS = 30; 
    private int size = 0; 

     public RegisterMenu(){ 
     newOwner = new Driver[MAX_ITEMS]; 
     Scanner scan = new Scanner(System.in); 
     System.out.println("1. Register New Car"); 
     System.out.println("2. Edit Car Information"); 
     System.out.println("3. Search Car Information"); 
     System.out.println("4. Display Car List"); 
     System.out.println("5. Exit"); 
     System.out.print("Enter Selection: "); 
     int s = scan.nextInt(); 
     switch(s){ 
      case 1: 
       System.out.println("--Register New Car--"); 
       Driver owner = newReg(); 
       newOwner[size++] = owner;     
       break; 
      case 2: 
       System.out.println("--Edit Car Infomation--"); 
       System.out.print("Enter RegNo to be edit: "); 
       int input = scan.nextInt(); //getting user input of index number which will be edited 
        if(newOwner[input].getName() == ""){ 
         System.out.println("No data in RegNo "+input); 
         } 
        else{ 
         Driver editOwner = newReg(); 
         newOwner[input] = editOwner; 
        } 
       break; 
      case 3: 
       System.out.println("--Search Car Infomation--"); 
       int index = searchReg(); 
       newOwner[index].toString(); 
       break; 
      case 4: 
       System.out.println("--Display Car Infomation--"); 
       displayReg(); 
       break; 

      case 5: 
       System.exit(0); 
      default: 
       System.out.println("Error selection"); 
     } 
    } 
    public Driver newReg(){ //newReg class for new registration 
     Driver owner = new Driver(); 
     Scanner scan = new Scanner(System.in); 
     owner.setRegNo(size+1); //registration number will auto update on each array 
     System.out.print("Enter Name: "); //getting info from user and put in setter 
     owner.setName(scan.nextLine()); 
     System.out.print("Enter IC: "); 
     owner.setIc(scan.nextLine()); 
     System.out.print("Enter PlateNo: "); 
     owner.carInfo.setPlateNum(scan.nextLine()); 
     System.out.print("Enter Color: "); 
     owner.carInfo.setColor(scan.nextLine()); 
     System.out.print("Enter Year: "); 
     owner.carInfo.setYear(scan.nextLine()); 
     System.out.print("Enter Make: "); 
     owner.carInfo.setMake(scan.nextLine()); 
     System.out.print("Enter Model: "); 
     owner.carInfo.setModel(scan.nextLine()); 
     System.out.print("Enter Capacity: "); 
     owner.carInfo.setCapacity(scan.nextLine()); 
     return owner; //return all back 
    } 

    public int searchReg(){ //searchReg will return index number of array 
     Scanner scan = new Scanner(System.in); 
     System.out.print("Enter Name or Ic to search: "); 
     String search = scan.nextLine(); 
     int dataIndex = 0; 
     for(int i = 0; i < newOwner.length; i++){ 
      if(search == newOwner[i].getIc() || search == newOwner[i].getName()){ 
       dataIndex = i; 
      } 
     } 
     return dataIndex; 
    } 
    public void displayReg(){ //display all array 
     for(int i = 0; i < newOwner.length; i++){ 
     System.out.println(newOwner[i].toString()); 
     } 
    } 
    public static void main (String args[]){ 
      while(true){ 
       RegisterMenu reg = new RegisterMenu(); 
      } 
    } 
} 

Car

public class Car { 

    public String plateNum; //variable 
    public String make; 
    public String model; 
    public String color; 
    public String year; 
    public String capacity; 

    public Car(){ //empty constructor 
    } 

    public Car(String plateNum, String color, String year, String make, String model, String capacity){ 
     this.plateNum = plateNum; 
     this.color = color; 
     this.year = year; 
     this.make = make; 
     this.model = model; 
     this.capacity = capacity; 
    } 
    public String getPlateNum(){ //get 
     return plateNum; 
    } 
    public String getMake(){ 
     return make; 
    } 
    public String getModel(){ 
     return model; 
    } 
    public String getColor(){ 
     return color; 
    } 
    public String getYear(){ 
     return year; 
    } 
    public String getCapacity(){ 
    return capacity; 
    } 
    public void setPlateNum(String plateNum){ //setter 
     this.plateNum = plateNum; 
    } 
    public void setMake(String make){ 
     this.make = make; 
    } 
    public void setModel(String model){ 
     this.model = model; 
    } 
    public void setColor(String color){ 
     this.color = color; 
    } 
    public void setYear(String year){ 
     this.year = year; 
    } 
    public void setCapacity(String capacity){ 
     this.capacity = capacity; 
    } 
} 

Driver

public class Driver { 
    private int regNo; //variable 
    private String name; 
    private String ic; 
    Car carInfo = new Car(); //calling car class 

    public Driver(){ //empty constructor 

    } 
    public Driver(int regNo, String name, String ic, Car carInfo){ //constructor with argument 
     this.regNo = regNo; 
     this.name = name; 
     this.ic = ic; 
     this.carInfo = carInfo; 
    } 
    public int getRegNo(){ //get info 
     return regNo; 
    } 
    public String getName(){ 
     return name; 
    } 
    public String getIc(){ 
     return ic; 
    } 
    public void setRegNo(int regNo){ //set from user 
     this.regNo = regNo; 
    } 
    public void setName(String name){ 
     this.name = name; 
    } 
    public void setIc(String ic){ 
     this.ic = ic; 

    } 
    public String toString(){ //to string for display 
     return "RegNo: "+getRegNo()+"\t\tName: "+getName()+"\t\tIc: "+getIc()+ 
       "\t\tPlateNo: "+carInfo.getPlateNum()+"\t\tColor: "+carInfo.getColor()+"\t\tYear: "+carInfo.getYear()+ 
         "\t\tMake: "+carInfo.getMake()+"\t\tModel: "+carInfo.getModel()+"\t\tCapacity: "+carInfo.getCapacity()+"cc"; 
    } 
} 
+1

在这种情况下,堆栈跟踪确实很有帮助。请将其添加到您的问题。 – Medo42

+0

'if(newOwner [input] .getName()==“”)'。不要使用==比较String的内容。 –

+0

作为您的问题的附注,您最好重复使用'RegisterMenu'对象,方法如下:'RegisterMenu reg = new RegisterMenu(); while(true){reg。interactiveRecordImport(); }'这样你可以避免在每次迭代中重新生成这个对象,并且为了后面的改进,你可以使它以某种方式存储结果。 – zmo

您反复在main方法

while (true) { 
    RegisterMenu reg = new RegisterMenu(); 
} 
012创建新 RegisterMenu对象

这有效地“湿巾”阵列newOwner这里以前的任何内容:

newOwner = new Driver[MAX_ITEMS]; 

因此在displayReg数组为空导致NPE。即使数组包含某些元素,也没有检查以确保当前元素不是null

对于立即修复,你需要使用的RegisterMenu一个实例,并

for (int i = 0; i < newOwner.length; i++) { 
    if (newOwner[i] != null) { 
     System.out.println(newOwner[i].toString()); 
    } 
} 

但这守卫检查可以通过使用ArrayList,而不是被淘汰。

注:在当前的IDE调试器是伟大的采购问题,如这些

+0

谢谢!这真的帮助我很多!我只是把RegisterMenu()中的(true)循环放在main方法中,而不是像冠军一样工作:) –

我看不到在你的索引变量,每次访问newOwner阵列时间一个单一的控制。以此示例为例:

int input = scan.nextInt(); //getting user input of index number which will be edited 
if(newOwner[input].getName() == ""){ 

您是否确定input索引与现有用户有关?如果不是,newOwner[index]返回null,当你调用getName时,你会得到一个NPE。

你正确定义的数组,但你只能创建和按需添加新的元素:

case 1: 
    System.out.println("--Register New Car--"); 
    Driver owner = newReg(); 
    newOwner[size++] = owner;     
    break; 

你的第一个初始化做到这一点:

newOwner = new Driver[MAX_ITEMS]; 

分配适当长度的数组但充满了null元素。您需要确保您没有访问空所有者,例如,在获取元素之前进行空值检查(加上范围检查以避免出现越界异常)。