我的程序目前接收汽车数据,如重量,引擎大小和颜色,然后创建一个对象 car 并在对象内设置这些值。
然后将对象添加到 car 的Arraylist中,该Arraylist位于单独的类中。当试图通过做Arraylist.get(0).color来显示第一辆汽车的属性时,它表示我的Arraylist为空。
我已经查看了它,似乎我正在重新初始化Arraylist,但我不知道如何。
这是设置对象 car 的代码,以及car对象的代码和类的构造函数:
public class AddCar {
public static MainMenu menu = new MainMenu();
public Car car;
CarList carList;
//constructor for the AddCar
public AddCar(){carList = new CarList();}
public class Car{
int weight;
String engine;
String color;
public Car(){}
public Car(weight, engine, color)
{
wt = weight;
eng = engine;
col = color;
}
}
public void addCar(){
int weight = 3000;
String engine = 6L
String color = blue;
car = new Car(weight, engine, color);
carList.addCar(car);
menu.user_input();
}
public void displayCar()
{
custList.dispCar();
}
方法addCar来自一个单独的类文件,它只是将汽车添加到Arraylist的末尾,这里是代码:
public class CarList {
List<Car> car_list;
public CarList()
{
car_list = new ArrayList<Car>(10);
}
//method to add car to arraylist
public void addCar(Car car)
{
car_list.add(car);
//this print statement works fine
System.out.println(car_list.get(0).color);
}
//method to display color property of first car
public void dispCar()
{
//this print statement comes back with null pointer exception
System.out.println(car_list.get(0).color);
}
当您使用上述类中的dispCar方法时会发生此问题,它会抛出空指针异常。
然后这是MainMenu,您可以选择该选项:
public class MainMenu {
private static Scanner keyboard1 = new Scanner(System.in);
private AddCar add;
public MainMenu()
{
add = new AddCar();
}
public void user_input()
{
System.out.println("Pick an Option:");
System.out.println("1. Add a car");
System.out.println("2. Remove a car");
System.out.println("Please enter the option #:");
int option = keyboard1.nextInt();
switch (option){
case 1: add.addCar();
case 2: add.displayCar();
}
}
}
答案 0 :(得分:2)
你害怕依赖处理你迷失了。
您的顶级课程为MainMenu
。我相信你想在任何时候都只有一个,并在你需要的时候调用它的方法。没关系。它创建AddCar
实例。
这就是坏事发生的地方 - AddCar
有这一行:
public static MainMenu menu = new MainMenu();
这意味着,它将拥有自己的MainMenu实例,与您用于创建任何AddCar实例的实例分开。因此,当您在menu.user_input()
方法中调用addCar
时,您在MainMenu的单独实例上调用它,其中一个具有不同的AddCar
,其中包含一个仍为空的不同CarList
。
至于如何修复它 - 让MainMenu
成为主类,为了继续循环而不是从AddCar方法回调MainMenu,并从中删除任何MainMenu。哦,并在你的交换机中添加break
语句,否则它的行为可能会让你感到惊讶。