ArrayIndexOutOfBoundsException:5没有任何意义?

时间:2014-02-25 21:31:37

标签: java arrays list indexoutofboundsexception

以下是我的两个课程:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class TopoSort {

    public static void main(String[] args) throws FileNotFoundException {

        File textFile = new File("graphs.txt");
        Scanner in = new Scanner(textFile);


        int numGraphs = in.nextInt();
        for(int i=0;i<1;i++)
        {
            int nodeNum = in.nextInt();
            tsMakeGraph graph1 = new tsMakeGraph(nodeNum);

            int[][] adjArray = new int[nodeNum][nodeNum];
            for(int j=0;j<nodeNum;j++)
            {

                for(int k=0;k<nodeNum;k++)
                {
                    adjArray[j][k] = in.nextInt();
                }

                for(int n=0;n<nodeNum;n++)
                {
                    graph1.addNode(n);
                }


            }

            for(int j=0;j<nodeNum;j++)
            {
                for(int k=0;k<nodeNum;k++)
                {
                    if(adjArray[j][k] == 1)
                    {
                        graph1.makeEdge(j, k);
                    }
                }
            }

            graph1.topologicalSort();

        }
    }
}

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class tsMakeGraph {

    private Node nodeList[];
    private int adjMatrix[][];
    private int numNodes;
    private int topoArray[];

    public tsMakeGraph(int nodeNum) {
        nodeList = new Node[nodeNum];
        adjMatrix = new int[nodeNum][nodeNum];
        numNodes = 0;
        for (int i = 0; i < nodeNum; i++) {
            for (int k = 0; k < nodeNum; k++) {
                adjMatrix[i][k] = 0;
            }
        }
        topoArray = new int[nodeNum];
    }

    public void addNode(int i) {
        nodeList[numNodes++] = new Node(i);

    }
}

当我通过for循环添加节点时,我得到一个越界错误但是如果我通过绑定graph1.addNode(0),graph1.addNode(2),graph1.addNode(3)手动添加节点),graph1.addNode(numNodes),它会工作。这对我来说没有意义,我一直在绞尽脑汁哈哈。顺便说一句,我编辑了我的大部分拓扑图类,因为这是一个硬件项目。

3 个答案:

答案 0 :(得分:1)

您的j和n索引for循环嵌套在TopoSort中,因此您尝试将nodeNum*nodeNum元素添加到大小为nodeNum的数组(graph1.nodeList)中。

你可以消除一个循环,因为从0开始有两个循环到nodeNum:

tsMakeGraph graph1 = new tsMakeGraph(nodeNum); 

int[][] adjArray = new int[nodeNum][nodeNum];
    for(int j=0;j<nodeNum;j++) {
        for(int n=0;n<nodeNum;n++) { // there was no need for two for loops here
            adjArray[j][k] = in.nextInt();
            graph1.addNode(n);
        }
    }

并制作nodeList尺寸nodeNum*nodeNum

public tsMakeGraph(int nodeNum) {
    nodeList = new Node[nodeNum*nodeNum];
    adjMatrix = new int[nodeNum][nodeNum];
    numNodes = 0;

    //adjMatrix values will be 0 by default, don't need to manually do that

    // this might need to be nodeNum*nodeNum as well, not used in your question
    // if you get another out of bounds error later, remember this!
    topoArray = new int[nodeNum]; 
}

我还将adjMatrix中每个值的手动设置删除为0,因为0是默认值,并且对于大量节点,O(n ^ 2)操作可能变得非常昂贵。

也许考虑使用nodeList替换nodeList(除非你的作业禁止这样做)。实际上,从j循环中拉出循环可能会更好,否则你将拥有每个节点的nodeNum个副本。不确定你的用法,所以我无法真正帮助你。

请记住,如果nodeList的大小错误,topoArray也可以。

答案 1 :(得分:1)

稍微缩短代码你有这个:

for(int j=0;j<nodeNum;j++)
{
    for(int n=0;n<nodeNum;n++)
    {
         graph1.addNode(n);
    }
}

public class tsMakeGraph {

    public tsMakeGraph(int nodeNum) {
        nodeList = new Node[nodeNum];
    }

    public void addNode(int i) {
        nodeList[numNodes++] = new Node(i);
    }
}

所以这里发生的事情是你有一个包含nodeNum个元素的数组,但是你要尝试添加nodeNum^2次。

我不知道是什么意思告诉你'正确'的解决方案。如果nodeList应该与adjMatrix具有相同数量的元素,那么您应该像new Node[nodeNum * nodeNum]一样对其进行实例化。 (与topoArray相同?)或者如果nodeList应包含整数0...nodeNum-1,则应将其从嵌套循环中拉出来。

答案 2 :(得分:0)

使用此代码添加节点时:

for(int j=0;j<nodeNum;j++)
{
    for(int n=0;n<nodeNum;n++)
    {
        graph1.addNode(n);
    }
}

您实际上是在添加节点nodeNum * NodeNum次数。因此,例如,如果节点num为2,则添加节点2 * 2 = 4次。

但是初始化nodeList数组时如下:

nodeList = new Node[nodeNum];

您只是将其设置为nodeNum的大小。因此,如果nodeNum为2,则您的数组只能容纳2个值。但是由于你在添加时的代码:

nodeList[numNodes++] = new Node(i);

你正在递增numNodes,4次。这导致越界错误。

初始化你的nodeList数组,如下所示:

nodeList = new Node[nodeNum*nodeNum];

应解决问题