2014-06-19 59 views
1

我已經搜索了有關該主題的各種主題,但無法找到處於相同情況或目前可以使用的任何解決方案。線程「main」中的Java異常java.util.NoSuchElementException - 使用掃描器讀取文件

我只是想讀取格式的TXT文件: Double0 Double0中斷0 Double1 Double1 INT1 .. Doublen Doublen內置內置

這裏是我的代碼:

public void readDatabase(String s) throws FileNotFoundException{  
    try {    
      BufferedReader br = new BufferedReader(new FileReader(s)); 
      String line = br.readLine(); 
      Scanner trainFile = null; 
      while (line != null) {  
       line.trim(); 
       trainFile = new Scanner(line); 
       double x = trainFile.nextDouble(); 
       double y = trainFile.nextDouble(); 
       int type = trainFile.nextInt(); 
       this.database.add(new Point(x,y,type)); 
       line = br.readLine(); 
      } 
      trainFile.close(); 
      br.close(); 
    } 
    catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 

有趣事情是這個函數工作了一段時間,但當我填充更多的數據txt文件停止工作。我也檢查了文件最終的錯誤,但一切都很好。根據我的堆棧跟蹤,該錯誤出現在第一個NextDouble()調用中。有沒有人有一個想法?

更新:

這裏是工作的文件類型:

0,6580097206539348 0,36101701387184226 2 
0,9529350156283241 0,7383387609711926 2 
0,6580097206539348 0,36101701387184226 2 
0,9529350156283241 0,7383387609711926 2 
0,6580097206539348 0,36101701387184226 2 
0,48639272096486486 0,4378985495387871 1 

但是,如果我添加一些額外的線條像這樣將停止工作:

0,6580097206539348 0,36101701387184226 2 
0,9529350156283241 0,7383387609711926 2 
0,6580097206539348 0,36101701387184226 2 
0,9529350156283241 0,7383387609711926 2 
0,6580097206539348 0,36101701387184226 2 
0,48639272096486486 0,4378985495387871 1 
0,8632344357711337 0,5253407956535258 1 
0,7351912765040557 0,8295830810436339 1 
0,6369155743204543 0,2757349130759706 1 
0,46512947234632146 0,4388586141249502 1 
0,8677892876429869 0,599451235810409 1 
0,8827084731154641 0,55652107505414 1 
+1

爲了幫助他人回答,你還需要分享你的文件。 –

+0

很可能是輸入文件結構的問題。檢查不正確的換行字符或共享文件內容 – Bobz79

+0

另一個額外的信息: 我有以下文件: 0,6580097206539348 \t 0,36101701387184226 0,9529350156283241 \t 0,7383387609711926 0,6580097206539348 \t 0, 36101701387184226 0,9529350156283241 \t \t 0,7383387609711926 2 0,6580097206539348 \t \t 0,36101701387184226 2 0,48639272096486486 \t \t 0,4378985495387871 1 和我的代碼工作, 當我在EOF 0,8632344357711337 \t 0,5253407956535258 它引發錯誤添加下面的新行。 –

回答

0

下一個輸入應該是總是是雙倍的吧?因此,而不是while(line != null)(當你有一個空行,這將返回true)檢查while(scanner.hasNextDouble())

public void readDatabase(String s) throws FileNotFoundException{  
    try {    
     final BufferedReader br = new BufferedReader(new FileReader(s)); 
     final Scanner trainFile = new Scanner(br); 
     while (trainFile.hasNextDouble()) {  
      double x = trainFile.nextDouble(); 
      double y = trainFile.nextDouble(); 
      int type = trainFile.nextInt(); 
      this.database.add(new Point(x,y,type)); 
     } 
     trainFile.close(); 
     br.close(); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 

你仍然需要逗號改爲小數點。否則上述將不起作用。

如果你的文件有逗號,你需要把它解釋爲一個小數點,那麼你可以嘗試以下方法:

public void readDatabase(String s) throws FileNotFoundException{  
    try {    
     final BufferedReader br = new BufferedReader(new FileReader(s)); 
     String line = br.readLine(); 
     while(line != null) { 
      line = line.replace(',', '.'); 
      final Scanner lineScanner = new Scanner(line); 
      if(!scanner.hasNextDouble()) 
       break;// quit loop 
      // else continue loop 
      double x = lineScanner.nextDouble(); 
      double y = lineScanner.nextDouble(); 
      int type = lineScanner.nextInt(); 
      this.database.add(new Point(x,y,type)); 
      line = br.readLine(); 
     } 
     br.close(); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 
+0

您發佈的第一個代碼是唯一適用於我的解決方案。謝謝! –

+0

我不明白你如何設置JRE,以便將逗號解釋爲小數點。 – Jared

0

在java中,由於逗號代替了小數,因此無法解析雙打。編輯文件以使用句點而不是逗號。

public static void readDatabase(String s) throws FileNotFoundException { 

    File file = new File(s); 
    Scanner scanner = new Scanner(file); 

    while (scanner.hasNextLine()) { 
     String line = scanner.nextLine(); 
     String[] values = line.split(" "); 
     double x = Double.parseDouble(values[0]); 
     double y = Double.parseDouble(values[1]); 
     int type = Integer.parseInt(values[2]); 
     System.out.println(x + " : " + y + " : " + type); 
    } 
    scanner.close(); 
} 

在文件:

我運行下面的功能測試的代碼

1.1 1.2 1 
2.1 2.2 2 
3.1 3.2 3 

,並得到了結果:

1.1 : 1.2 : 1 
2.1 : 2.2 : 2 
3.1 : 3.2 : 3 

請注意,我的代碼分離基於找到的空格,不使用掃描儀搜索雙打/整數。在平面文件中,最好使用標準格式(空格,逗號,冒號等)而不是格式化文件,以便更容易解析文件。

編輯

如果你想保持你的平面文件的格式設置,因爲它是簡單地改變逗號期間將解決您的問題。我用你的函數(更改數據庫線輸出):

public static void readDatabase(String s) throws IOException { 

    BufferedReader br = new BufferedReader(new FileReader(s)); 
    String line = br.readLine(); 
    Scanner trainFile = null; 
    while (line != null) { 
     line.trim(); 
     trainFile = new Scanner(line); 
     double x = trainFile.nextDouble(); 
     double y = trainFile.nextDouble(); 
     int type = trainFile.nextInt(); 
     System.out.println(x + " : " + y + " : " + type); 
     line = br.readLine(); 
    } 
    trainFile.close(); 
    br.close(); 
} 

在文件(這是你給了,用逗號數據更改爲週期):

0.6580097206539348 0.36101701387184226 2 
0.9529350156283241 0.7383387609711926 2 
0.6580097206539348 0.36101701387184226 2 
0.9529350156283241 0.7383387609711926 2 
0.6580097206539348 0.36101701387184226 2 
0.48639272096486486 0.4378985495387871 1 
0.8632344357711337 0.5253407956535258 1 
0.7351912765040557 0.8295830810436339 1 
0.6369155743204543 0.2757349130759706 1 
0.46512947234632146 0.4388586141249502 1 
0.8677892876429869 0.599451235810409 1 
0.8827084731154641 0.55652107505414 1 

和輸出表現很好。

+0

好非常感謝您的幫助,但我的計算機上的神異原因: 它不具有點工作,但是當我更改爲逗號它讀取某些行 的你說在那裏工作的相同代碼在這裏不能使用與ip相同的文件。 –

+1

你能給我更多關於你的開發環境的信息嗎?你使用的是什麼編譯器,JDK版本,你使用的是什麼操作系統? Java是獨立的,因此無論您使用的計算機類型如何,它都應該可以工作。另外,你是否嘗試使用我的代碼和我發佈的文件?這是一個通用的基本示例,就像一個概念驗證,然後您可以查看主文件以查看錯誤的位置。 –

+0

嘿@Mike Elofson,使用您的代碼,我設法使它正確打印。但是,當我嘗試創建一個新的點內的函數添加到我的數據庫 - > this.database.add(新點(x,y,類型));在保存3個變量之後,它說我不能在靜態上下文中使用它。你對這個問題有什麼建議嗎? –

1

根據JavaDoc的nextDouble()掃描 輸入的下一個令牌爲一個double。這個方法會拋出InputMismatchException如果 下一個標記不能被轉換成一個有效的double值。

所以這裏Scanner無法找到Double你行0,6580097206539348 0,36101701387184226 2。還有一種解決方案是循環中只需更換,.(只有當你的每一個行不包含逗號不是爲了這個目的除外)

FOR EXAMPLE

String yourLine="0,6580097206539348 0,36101701387184226 2" 
    Scanner trainFile = new Scanner(line.replace(',', '.')); 
       double x = trainFile.nextDouble(); 
       double y = trainFile.nextDouble(); 
       int type = trainFile.nextInt(); 

而且從Exception倖存您可以使用hasNextDoubel()hasNextInt()方法使掃描儀檢查數據中是否存在double/int,它返回true/false。您可以在處閱讀更多關於此的信息

相關問題