2014-02-25 84 views
0

這裏是我的兩個類:ArrayIndexOutOfBoundsException:5沒有任何意義?

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

    } 
} 

我發現了一個出界失誤,當我通過添加節點的循環,但如果我通過手動添加搭售的節點out graph1.addNode(0),graph1.addNode(2),graph1.addNode(3),graph1.addNode(numNodes),它會工作。這對我沒有意義,我一直在絞盡腦汁哈哈。順便說一句,我編輯了我的大部分topo圖類,因爲這是一個硬件項目。

+2

您從異常回溯在異常起源知道。在失敗操作之前添加System.out.println調用以轉儲數組索引和數組.length值。有些東西會讓你感到驚訝。 –

+3

'for(int i = 0; i <1; i ++)'< - 這不會讓你走得太遠......複製/粘貼錯誤? – fge

+1

我看不出有什麼明顯的錯誤。異常發生在哪一行?順便說一句,tsMakeGraph的構造函數中的每個元素都設置爲0的循環是不必要的;新的數字數組元素已經爲0. – Boann

回答

1

您的j和n循環索引嵌套在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)操作可能變得非常昂貴。

也許考慮使用ArrayList來代替nodeList(除非你的作業禁止這樣做)。實際上,從j循環中取出循環可能會更好,否則您將擁有每個節點的nodeNum副本。不確定您的使用情況,所以我無法真正幫助您。

請記住,如果nodeList是錯誤的大小,topoArray也可能是。

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那麼您應該將其從嵌套循環中取出。

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 = new Node[nodeNum]; 

你只將其設定爲大小NODENUM的。所以如果nodeNum是2,你的數組只能保存2個值。但由於代碼在添加時:

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

您正在增加numNodes,4次。這是導致出界的錯誤。

正開始您的節點列表陣列像這樣:

nodeList = new Node[nodeNum*nodeNum]; 

應該可以解決這個問題