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;
}
}