2013-02-07 228 views
0

掃描器我想讀我能夠讀取前兩個數字,當我嘗試閱讀我得到一個異常的符號這種格式爲什麼不工作

4 4 
* . . . 
. . . . 
. * . . 
. . . . 
4 4 
* * . . 
. . . . 
. . . . 
. . * . 

的輸入。我可以使用BufferedReader來讀取每一行並解析輸入,但爲什麼我無法使用掃描器來執行此操作?

這是我的代碼

 public static void main(String[] args) { 
       Scanner in = new Scanner(System.in); 
       while (in.hasNextLine()) { 
        Scanner s = new Scanner(in.nextLine()); 
        if (!s.hasNextLine()) 
         break; 

        int x = s.nextInt(); // 4 
        int y = s.nextInt(); // 4 
        for (int i = 0; i <= x - 1; i++) { 
         for (int j = 0; j <= y - 1; j++) { 
          System.out.println(s.hasNext()); // false 
          String symbol = s.next(); //NoSuchElementException WHY? 
         } 
        } 
       } 
      } 
     } 

回答

2

你不應該試圖讀取數字時沒有任何數字存在。

你的循環,在僞代碼,看起來像

While there is a line available: 
    s = NextLine() 
    x = FirstInt(s) 
    y = SecondInt(s) 
    // Some other stuff 

當你分配給xy,有可用,除了第一行不數,所以你的應用程序崩潰。

更好的解決方案,它匹配的問題,將是

Scanner in = new Scanner(System.in); 
if (!in.hasNextInt()) exitAndPrintError(); 
int rows = in.nextInt(); 
if (!in.hasNextInt()) exitAndPrintError(); 
int cols = in.nextInt(); 
for (int r = 0; r < rows; r++) { 
    for (int c = 0; c < cols; c++) { 
     if (!in.hasNext()) exitAndPrintError(); 
     process(in.next()); 
    } 
} 

該解決方案確實沒有太大檢查錯誤,使所有的錯誤,你將不得不寫一些exitAndPrintError功能報告。

作爲一個方面說明:如果你嘗試s.hasNext()和返回false,那麼你應該感到驚訝,如果s.next()拋出異常。這就是爲什麼hasNext*方法可用於Scanner--它們讓您有機會知道您何時達到輸入的結尾,而不是嘗試讀取比可用輸入更多的輸入。


我將其留作練習來更新此代碼以處理單個文件中的多組數據,但這並不困難。在您發佈的代碼中的關鍵錯誤是,如果你創建僅使用來自in線掃描儀s,你不會發現,單行s是處理內部的多條線結構。

+0

看看更新後的Input.But我試圖讓符號在for循環中使用Next代碼在 –

+0

處打破感謝看來我使用了兩個掃描器,以便我可以退出循環,搞砸了。我將只使用一個掃描器 –

1

總體設計問題,我會回答你的問題。

你得到NoSuchElementException因爲,你猜怎麼着,s有沒有更多的元素。輸出爲s.hasNext()的結果會變得更加明顯,它返回false。

原因很簡單。您使用in的一行代碼分配s

要解決整個程序,你需要使用一個掃描儀,而不是它的多個實例。

+0

感謝您指出。順便說一句,我用兩臺掃描儀,以便我可以打破循環。說如果我只有一個掃描儀,我會做(而in.hasNext),並獲得值,但我無法打破它沒有用戶提供的終止字符串 –

+0

@YeshwanthVenkatesh不,這是不正確的。使用單個掃描儀解決此問題是完全可能的,只需要查看EOF作爲終止條件。 –

+1

@YeshwanthVenkatesh你可以用一個巧妙的條件'continue'來管理它。 – Achrome