繁体   English   中英

Java-对象数组-空指针异常

[英]Java - Object Array - Null Pointer Exception

我在做一个BFS问题,必须使用Java查找从一个节点到另一个节点的最短路径。 每个节点只有一个连接。 但是由于某种原因,当我尝试将新节点添加到队列中时,它将返回一个空指针异常。

这是我的代码(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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM