2010-11-14 60 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