2013-06-18 2 views
0

Я попытался настроить 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

ответ

2

Вы повторно создавать новые RegisterMenu объектов в main методе

while (true) { 
    RegisterMenu reg = new 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 вместо этого.

Примечания: Debuggers текущих Ид велики по вопросам сорсинга, такие как эти

+0

спасибо! это действительно помогает мне много! я просто поставлю while (true) loop в RegisterMenu() вместо этого в основном методе, чем он работает как чемпион :) –

1

Я не могу увидеть один контроля над индексным переменными каждый раз, когда вы получаете доступ к 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 элементов. Вам нужно убедиться, что вы не обращаетесь к нулевому владельцу, например, выполняя нулевую проверку перед получением элемента (плюс, проверка диапазона, чтобы исключить исключение из-за пределов).

Смежные вопросы