Java 构造有向图,获取空指针异常

Java 构造有向图,获取空指针异常,java,Java,我正在以邻接列表的形式构建一个有向图。当我试图打印出每门课程的预科要求时,我收到了一个空点异常,我不确定为什么。它是否与课程类是静态的有关 public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int numCourses = Integer.par

我正在以邻接列表的形式构建一个有向图。当我试图打印出每门课程的预科要求时,我收到了一个空点异常,我不确定为什么。它是否与课程类是静态的有关

   public static void main(String[] args) {
            // TODO Auto-generated method stub
            Scanner in = new Scanner(System.in);
            int numCourses = Integer.parseInt(in.nextLine());

            Course[] adjList = new Course[numCourses];

            //Create our courses
            for (int i = 0; i < numCourses; i++){
                    Course c = new Course(i);
                    adjList[i] = c;
            }

            //input we are reading in, each line ends with a 0.
            //7       -> number of courses
            //3 0     -> Course 1 has 1 prereq, course 3
            //0       -> Course 2 has no prereqs
            //2 0     -> Course 3 has 1 Pre-req, course 2
            //1 2 6 0 -> Course 4 has 3 prereqs, courses 1, 2, 6
            //3 1 0   -> Course 5 has 2 prereqs, courses 3 and 1
            //4 0     -> Course 6 has one prereq, course 4
            //0       -> Course 7 has no prereqs
            for (int i = 0; i <numCourses; i++){
                    String input = in.nextLine();
                    String[] split = input.split("\\s+");
                    for (int j = 0; j < split.length; j++){
                            adjList[i].setPreReqSize(split.length-1); //set number of preReqs, -1 because of the ending 0 we dont want to include
                            if (Integer.parseInt(split[j])== 0){
                                    break;
                            }
                            else{
                                    adjList[i].preReqs[j] = adjList[Integer.parseInt(split[j])];
                            }
                    }
            }

            for (Course c: adjList){
                    c.printPreReqs();
            }

    }

    public static class Course{
            int courseNum;
            boolean visited = false;
            Course[] preReqs;

            public Course(int num){
                    this.courseNum = num;
            }

            public void setPreReqSize(int n){
                    this.preReqs = new Course[n];
            }

            public String printPreReqs(){
                    if (this.preReqs.length == 0){
                            return "None";
                    }
                    else{
                            String result = "Course"+courseNum+ " has the following preReqs ->";
                            for (int i = 0; i < this.preReqs.length; i++){
                                    result += " Course" + this.preReqs[i].courseNum + " ";
                            }
                            return result;
                    }
            }
    }
publicstaticvoidmain(字符串[]args){
//TODO自动生成的方法存根
扫描仪输入=新扫描仪(系统输入);
int numCourses=Integer.parseInt(in.nextLine());
课程[]调整列表=新课程[numCourses];
//创建我们的课程
for(int i=0;i课程数量
//3 0->课程1有1个预请求,课程3
//0->课程2没有预先要求
//2 0->课程3有1个预申请,课程2
//1 2 6 0->课程4有3个先决条件,课程1、2、6
//3 1 0->课程5有2个预科,课程3和课程1
//4 0->课程6有一个预要求,即课程4
//0->课程7没有预先要求

对于(int i=0;i有两个问题:

1) 例外情况是,您不断为
split
中的每个字符串创建新数组
preReqs
。若要修复,请将
adjList[i].setPreReqSize(split.length-1);
移出内部for循环(上面一行就可以了)

2) 一个小问题:数组索引从
0
开始,但您的
courseNum
似乎从
1
开始。您需要注意这一点

以下更改将修复此问题:

Course c = new Course(i+1);


我建议将此功能更改为更具防御性:

        public String printPreReqs(){
                if ( (this.preReqs==null) || (this.preReqs.length == 0)){
                        return "None";
                }
                else{
                        String result = "Course"+courseNum+ " has the following preReqs ->";
                        for (int i = 0; i < this.preReqs.length; i++){
                                result += " Course" + this.preReqs[i].courseNum + " ";
                        }
                        return result;
                }
        }
公共字符串printpreqs(){
if((this.preReqs==null)| |(this.preReqs.length==0)){
返回“无”;
}
否则{
String result=“Course”+courseNum+”具有以下预要求->”;
对于(int i=0;i
这将允许在您仅在
setPreReqSize
中初始化
preReqs
时防止出现一些死角情况,这至少不一定会发生


顺便说一句:你在哪一点得到了
NullPointerException
的准确答案?

你能发布你的错误日志吗?谢谢你的修复,它们都能工作。这就是在无睡眠状态下编写代码时发生的情况!
        public String printPreReqs(){
                if ( (this.preReqs==null) || (this.preReqs.length == 0)){
                        return "None";
                }
                else{
                        String result = "Course"+courseNum+ " has the following preReqs ->";
                        for (int i = 0; i < this.preReqs.length; i++){
                                result += " Course" + this.preReqs[i].courseNum + " ";
                        }
                        return result;
                }
        }