2010-11-14 58 views
0

嘿,我不斷收到一個NoSuchElement異常在線:maze [r] [c] = scan.next(); 任何幫助將不勝感激。由於我的循環出了什麼問題?繼續收到NoSuchElementException

try { 
     Scanner scan = new Scanner(f); 
     String infoLine = scan.nextLine(); 
     int rows=0; 
     int columns=0; 
     for(int i = 0; i<infoLine.length();i++){ 
      if(Character.isDigit(infoLine.charAt(i))==true){ 
       rows = (int)infoLine.charAt(i); 
       columns = (int)infoLine.charAt(i+1); 
       break; 
      } 
     } 

     String [][] maze = new String[rows][columns]; 
     int r = 0; 
     while(scan.hasNextLine()==true && r<rows){ 
      for(int c = 0; c<columns;c++){ 
       maze[r][c]=scan.next(); 
      } 
      r++; 
     } 
     return maze; 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
+0

一個布爾值,相較於真正的是一樣的只是使用布爾本身。也就是說,只要你有「x == true」,你可以簡單地使用「x」。 – 2010-11-14 01:55:40

回答

4

看看你的這部分代碼:

while(scan.hasNextLine()==true && r<rows){ // 1 
     for(int c = 0; c<columns;c++){   // 2 
      maze[r][c]=scan.next();    // 3 
     }          // 4 
     r++;         // 5 
    }           // 6 

在第1行你正在檢查,以確保掃描有可用的另一條線。但在第3行中,您閱讀了該行 - 在2:4循環內。所以如果有多於一列的話,你會不止一次要求下一次掃描 - 而你只檢查下一行是否有一行。因此,在第二列中,如果您在掃描結束時,即使掃描結束,您仍然嘗試從掃描中讀取數據。

試試這個:

try { 
    Scanner scan = new Scanner(f); 
    String infoLine = scan.nextLine(); 
    int rows = 0; 
    int columns = 0; 
    for (int i = 0; i < infoLine.length();i++) { 
     if (Character.isDigit(infoLine.charAt(i))) { 
      rows = Character.digit(infoLine.charAt(i), 10); 
      columns = Character.digit(infoLine.charAt(i + 1), 10); 
      break; 
     } 
    } 

    String [][] maze = new String[rows][columns]; 
    int r = 0; 
    while(scan.hasNextLine() && r < rows) { 
     int c = 0; 
     while(scan.hasNextLine() && c < columns) { 
      maze[r][c]=scan.next(); 
      c++ 
     } 
     r++; 
    } 
    return maze; 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 
+0

我不知道如何解決它。 – 2010-11-14 02:05:00

+0

那麼,你有代碼的期望,你的掃描有足夠的條目來涵蓋所有的列。您的數據違反了期望。你可以改變內部的'for'循環來匹配你的外部while循環的格式 - 並且包含一個hasNextLine()檢查 - 但是它會在一行的中間退出。如果你確定,那可能是你的解決方案。如果不是,你需要在更高的層面上重新考慮這一點。 – 2010-11-14 02:08:20

+0

我相信你對行和列的判斷是錯誤的。 'rows =(int)infoLine.charAt(i);'將得到int的ascii值,但看起來你真正想要的是char所表示的整數。 'rows = Character.digit(infoLine.charAt(i),10);'可能是得到這個的最好方法。 – 2010-11-14 02:14:53