Java - 对象数组 - 空指针异常
Java - Object Array - Null Pointer Exception
我在做一个 BFS 问题,我必须使用 java 找到从一个节点到另一个节点的最短路径。每个节点只有一个连接。但出于某种原因,当我尝试将新节点添加到队列时,它 returns 一个空指针异常。
这是我的代码 (Java):
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class Main{
static Friend[] friends = new Friend[10000];
public static void main(String[] args) throws Exception{
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(r.readLine());
for(int a = 0; a < N; a++){
String[] get = r.readLine().split(" ");
int A = Integer.parseInt(get[0]);
int B = Integer.parseInt(get[1]);
friends[A] = new Friend(A);
friends[B] = new Friend(B);
friends[A].partner = new Friend(B);
}
while(true){
String[] get = r.readLine().split(" ");
int A = Integer.parseInt(get[0]);
int B = Integer.parseInt(get[1]);
if(A == 0 && B == 0)break;
BFS(friends[A], friends[B]);
}
}
private static void BFS(Friend a, Friend b){
Queue<Friend> Q = new LinkedList<Friend>();
Queue<Integer> DQ = new LinkedList<Integer>();
Q.add(a);
DQ.add(-1);
while(!Q.isEmpty()){
Friend f = Q.poll();
int dist = DQ.poll();
if(f.ID == b.ID){
System.out.println("YES " + dist);
return;
}
Q.add(f.partner); //getting a Null-Pointer exception here.
DQ.add(dist + 1);
}
System.out.println("NO");
}
}
class Friend{
int ID;
Friend partner = null;
public Friend(int id){
ID = id;
}
}
示例输入
6
1 2
2 3
3 1
10 11
100 10
11 100
1 100
2 3
0 0
我发现了问题。每次将新朋友添加到朋友数组中时,都会覆盖前一个朋友。这意味着当你第一次添加数字 1 时,它有一个合作伙伴 2。但是,当你添加 3 1 时,你覆盖了 1,它现在没有合作伙伴,所以如果你改变代码只添加它,如果它是null,并将其伙伴指向实际的另一个对象而不是新对象,那么所有指针都将保持其完整性:
if(friends[A]==null)
friends[A] = main.new Friend(A);
if(friends[B]==null)
friends[B] = main.new Friend(B);
friends[A].partner = friends[B];
但是,如果没有路径,BFS 方法现在有一个无限循环,如 1 --> 100 的情况,所以如果我们回到原来的节点,我们需要跳出那里,所以我们需要添加:
if(f.ID == a.ID && dist > -1) break;
我在做一个 BFS 问题,我必须使用 java 找到从一个节点到另一个节点的最短路径。每个节点只有一个连接。但出于某种原因,当我尝试将新节点添加到队列时,它 returns 一个空指针异常。
这是我的代码 (Java):
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class Main{
static Friend[] friends = new Friend[10000];
public static void main(String[] args) throws Exception{
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(r.readLine());
for(int a = 0; a < N; a++){
String[] get = r.readLine().split(" ");
int A = Integer.parseInt(get[0]);
int B = Integer.parseInt(get[1]);
friends[A] = new Friend(A);
friends[B] = new Friend(B);
friends[A].partner = new Friend(B);
}
while(true){
String[] get = r.readLine().split(" ");
int A = Integer.parseInt(get[0]);
int B = Integer.parseInt(get[1]);
if(A == 0 && B == 0)break;
BFS(friends[A], friends[B]);
}
}
private static void BFS(Friend a, Friend b){
Queue<Friend> Q = new LinkedList<Friend>();
Queue<Integer> DQ = new LinkedList<Integer>();
Q.add(a);
DQ.add(-1);
while(!Q.isEmpty()){
Friend f = Q.poll();
int dist = DQ.poll();
if(f.ID == b.ID){
System.out.println("YES " + dist);
return;
}
Q.add(f.partner); //getting a Null-Pointer exception here.
DQ.add(dist + 1);
}
System.out.println("NO");
}
}
class Friend{
int ID;
Friend partner = null;
public Friend(int id){
ID = id;
}
}
示例输入
6
1 2
2 3
3 1
10 11
100 10
11 100
1 100
2 3
0 0
我发现了问题。每次将新朋友添加到朋友数组中时,都会覆盖前一个朋友。这意味着当你第一次添加数字 1 时,它有一个合作伙伴 2。但是,当你添加 3 1 时,你覆盖了 1,它现在没有合作伙伴,所以如果你改变代码只添加它,如果它是null,并将其伙伴指向实际的另一个对象而不是新对象,那么所有指针都将保持其完整性:
if(friends[A]==null)
friends[A] = main.new Friend(A);
if(friends[B]==null)
friends[B] = main.new Friend(B);
friends[A].partner = friends[B];
但是,如果没有路径,BFS 方法现在有一个无限循环,如 1 --> 100 的情况,所以如果我们回到原来的节点,我们需要跳出那里,所以我们需要添加:
if(f.ID == a.ID && dist > -1) break;