0

我正在尝试用 Java 编写一个程序,该程序在邻接矩阵上执行 DFS 和 BFS。到目前为止,我的代码可以编译并提供所需的输出。

但是,我遇到了一个我无法解决的错误,我觉得这可能与我的 for 循环有关。

错误如下:

 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
        at GraphMatrix.dfVisit(GraphMatrix.java:304)
        at GraphMatrix.dfVisit(GraphMatrix.java:306)
        at GraphMatrix.dfVisit(GraphMatrix.java:306)
        at GraphMatrix.DF(GraphMatrix.java:261)
        at GraphMatrix.main(GraphMatrix.java:347)

错误代码如下:

    // method to initialise Depth First Traversal of Graph
public void DF( int s)
{
    id = 0;

    for(int v = 1; v <= V; v++) {
        visited[v] = 0;

    }
    dfVisit(0, s); //error being signaled here

}

if 语句中的第二行:

private void dfVisit( int prev, int v)
{
    visited[v] = ++id;
    System.out.println("Visited vertex" + ": " + v + "  Along edge  : " + prev);

    for (int u: adj[v]) {
       if (visited[u] != visited[v]) {

           dfVisit(prev, u);
       }
    }
}

最后主要是 g.DF(s) :

 public static void main(String[] args) throws IOException
{
    int s = 4;
    String fname = "wGraph3.txt";

    GraphMatrix g = new GraphMatrix(fname);

    g.display();

    g.DF(s);


    g.BF(s);

}

}

任何帮助,将不胜感激。

4

1 回答 1

0

根据堆栈跟踪,该dfVisit()方法引发了异常,显然是在评估表达式时visited[u] != visited[v]。从上下文来看,它必须是由于u超出数组范围而引起的visited(否则会更早抛出异常)。异常消息为您提供越界索引 (9) 的值。

由于每个值u都是 的一个元素adj[v],因此得出adj[v]包含错误数据的结论似乎是合理的,或者您正在错误地解释其内容。我只能推测这可能是如何或为什么会这样,但我的第一个猜测是 的元素adj[v]是用基于 1 的索引表示的(也就是说,好像最小的有效数组索引是 1),而 Java 使用 0 - 基于索引。

于 2017-03-21T20:21:30.823 回答