即使初始化数组,也会出现空指针异常

时间:2012-11-04 23:54:16

标签: java

我正在编写一个程序来接收需要安排的各种讲座请求。 讲座有开始时间和结束时间。 要求是安排最大讲座数。 (算法是按结束时间安排它们并选择不重叠的讲座 - 贪婪策略)。 为了做到这一点,我有一个“讲座”课和一个“讲座课程”课程。 我创建了一个输入数组(讲座)。然后我请求用户输入各种请求。 但是我收到错误“线程中的异常”主“java.lang.NullPointerException”。 请帮助。 谢谢。 PS: 我在“input [i] .time [0] = in.nextInt();”行中激动地发出错误。 确切的错误是: 线程“main”java.lang.NullPointerException中的异常 在lecturescheduling.LectureScheduling.main(LectureScheduling.java:116)

//讲课班..时间[0]是开始时间[1]是讲座的结束时间

 class lecture{
     int[] time= new int[2];

     lecture (int a, int b){
          time[0]=a;
          time[1]=b;        
     }
 }

// LectureScheduling类的一部分

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.println("Input number of lectures ");
    int arraylength = in.nextInt();
    lecture [] input= new lecture[arraylength] ; 
    for (int i=0; i<arraylength; i++){
        System.out.println("Input start time of lecture "+ i);
        input[i].time[0] = in.nextInt();        
        System.out.println("Input end time of lecture "+ i);
        input[i].time[1] = in.nextInt();        
        System.out.println();
    }
    input=SortByStartTime(input);
    input=CreateSchedule(input);
    PrintSchedule(input);
}

1 个答案:

答案 0 :(得分:6)

分配对象数组时,实际上只分配引用,而不是对象本身(lecture [] input= new lecture[arraylength] ;不会创建类型为lecture的对象,这与C ++等值类型语言不同)。因此,当您访问:

input[i].time[0] = in.nextInt(); 

无需先为lecture创建input[i]的实例,即可获得NPE。

要解决此问题,您需要在new的每个对象上使用lecture运算符,然后再尝试访问它(假设空构造函数可见并已定义):

input[i] = new lecture();

P.S。在java中有一个类型名称的约定(例如lecture,它是一种类型) - 以大写字母开头。因此,我建议将lecture重命名为Lecture