有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用单个文件编写的java应用程序引发NullPointerException

无法理解,如果我将类拆分为不同的文件并将它们声明为公共的,我对抽象类getOn方法有问题,就像这样

package test.local;

abstract public class Passenger {
    public void getOn(Transport transport) {
        transport.takePassenger(Passenger.this);
    }
}

package test.local;

public class Dog extends Passenger {
}

一切正常,我可以将Passenger.this传递给getOn方法,但如果我在单个文件中编写整个应用程序,就像这样

import java.util.List;

interface Transport {
    public void takePassenger(Passenger passenger);
}

class Bus implements Transport {
    private List<Passenger> passengers;

    public void takePassenger(Passenger passenger) {
        passengers.add(passenger);
    }

    public List<Passenger> getPassenger() {
        return passengers;
    }
}

abstract class Passenger {
    public void getOn(Transport transport) {
        transport.takePassenger(Passenger.this);
    }
}

class Dog extends Passenger {

}


public class Magic {
   public static void main(String []args) {
      Bus bus = new Bus();

      Dog passenger = new Dog();
      passenger.getOn(bus);
   }
}

我在线程“main”java中遇到异常。lang.NullPointerException 为什么?

Exception in thread "main" java.lang.NullPointerException
at Bus.takePassenger(Magic.java:11)
at Passenger.getOn(Magic.java:21)
at Magic.main(Magic.java:35)

共 (4) 个答案

  1. # 1 楼答案

    在初始化列表之前,它将始终抛出NullPointerException:

    private List<Passenger> passengers;
    

    private List<Passenger> passengers = new ArrayList<Passenger>();
    
  2. # 2 楼答案

    改变这一点:

    private List<Passenger> passengers;
    

    为此:

    private List<Passenger> passengers = new ArrayList<Passenger>();
    

    在前一行代码中,您尚未将passengers初始化为值,因此它为空。尝试去引用它,例如使用passengers.add(passenger),将产生NullPointerException

  3. # 3 楼答案

    这是因为您尚未初始化

    private List<Passenger> passengers;
    

    在总线类中创建一个默认构造函数,如下所示:

    public Bus(){
       passengers = new ArrayList<>();
    }
    
  4. # 4 楼答案

    需要在Bus类中初始化passengers字段。更改此声明:

    private List<Passenger> passengers;
    

    致:

    private List<Passenger> passengers = new ArrayList<>();
    

    将类移动到不同的文件与您报告的错误无关