2017-05-14 32 views
1

我想解析一個文件到一個地圖。我試圖解析的文本(由sys在sys中顯示)是NumberFormatException拋出一個正確的字符串?

10 przysuń hotel o 90 metrów。每個單詞分隔\t

該文件是UTF-8編碼的。

這裏是我的方法:

private void readFile() { 
    try { 
     if (transcriptFile == null) 
      transcriptFile = new File(transcriptPath); 

     lines = Files.readAllLines(transcriptFile.toPath()); 
     for (String s : lines) { 
      if (!s.isEmpty()) { 
       List<String> parts = Arrays.asList(s.split("\t")); 
       System.out.println(parts); 

       int id = Integer.parseInt(parts.get(0).trim()); 
       parts.remove(0); 
       String text = String.join(" ",parts); 
       map.put(id,text); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

而且我得到這個異常:

[10, przysuń, hotel, o, 90, metrów ] 
java.lang.NumberFormatException: For input string: "10" 
at 
java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:580) 
at Controller.readFile(Controller.java:143) 
at Controller.access$000(Controller.java:29) 
at Controller$SpeechTask.call(Controller.java:202) 
at Controller$SpeechTask.call(Controller.java:154) 
at javafx.concurrent.Task$TaskCallable.call(Task.java:1423) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.lang.Thread.run(Thread.java:748) 

我看不出爲什麼這不會是可解析。

+0

也許在字符串中有一些不可見的特殊字符?如果你首先去掉所有的非數字,請嘗試'int id = Integer.parseInt(parts.get(0).replaceAll(「\\ D +」,「」));' – janos

+1

可能是一個字符編碼問題。 – KevinO

+0

可能重複[什麼是NumberFormatException,我該如何解決它?](http://stackoverflow.com/questions/39849984/what-is-a-numberformatexception-and-how-can-i-fix-it) – xenteros

回答

0

你的輸入文件可能包含一個不可見的字符Byte Order Mark (BOM),它可能位於字符10的前面。從this post嘗試溶液或Apache的BOMInputStream

非編程,你可以使用UTF-8記事本++的編碼無BOM 功能並保存輸入文件。

0

u能替換下面的行

List<String> parts = Arrays.asList(s.split("\t")); 

有了這個和檢查一次

List<String> parts = Arrays.asList(s.replaceAll("\\s+", ",").split(",")); 

而且講的是同樣的異常再來。

+0

是的,沒有變化。 – Asalas77

0

似乎這是由於字符編碼問題,當定義編碼爲UTF-8時,記事本在文件前面保存了一些額外的字符。

當我嘗試這個,parts.get(0).trim()返回?10而不是10因此有NumberFormatException。假設,如果你已經定義了10作爲第二個字,然後parts.get(1).trim()將返回10並不會有任何NumberFormatException

以下問題解釋這個問題Reading strange unicode character in Java?

而且Arrays.asList返回不能被修改的列表,因此即使Integer.parseInt成功,parts.remove(0)中也可能有UnsupportedOperationException

+0

關於你的最後一點,我把它改成'parts = new ArrayList <>(Arrays.asList(s.split(「\ t」));'所以刪除元素不應該是一個問題。 – Asalas77

相關問題