2013-08-30 60 views
2

只是想知道我在做什麼錯在這裏。我正在嘗試從文件中讀取數據並解析數據。我不斷收到錯誤「java.lang.NumberFormatException」,它不能分析數字。我知道我使用getNextDouble()或得到nextInt(),但我試圖保持代碼一般,因爲我可以。任何想法將不勝感激。 TY。解析文本文件中的數字

這裏是從我的文本文件中的行的一個示例:

 foo Bar 19.35 55 987.0054 4 

public void readFile(){ 
     int i=0; 
     String line; 

     try{ 
      fileIn = new Scanner(new File("pa1Names.txt")); 
     }catch(Exception e){ 
      System.out.println("Fatal Error: File was not opened"); 
     } 

     while(i<names.length && fileIn.hasNext()){ 
      line = fileIn.nextLine(); 
      StringTokenizer st = new StringTokenizer(line); 
      int m = st.countTokens(); 

      names[i] = st.nextToken(); 

      for (int k = 0; k<m-5; k++) 
      { 
       names[i] = names[i] + " " + st.nextToken(); 
      } 

      reals[i][0] = Double.parseDouble(st.nextToken()); 
      ints[i][0] = Integer.parseInt(st.nextToken()); 
      reals[i][1] = Double.parseDouble(st.nextToken()); 
      ints[i][1] = Integer.parseInt(st.nextToken()); 

      i++; 
     }//end while 
     fileIn.close(); 
    } 
+0

'st.nextToken()'你應該做一個'System.out.print'來看看那不是一個數字,那就是你得到那個異常 – nachokk

+0

這是一個好主意。 – StillLearningToCode

回答

1

在你的try/catch塊裏面去,甚至之前的第一個標記,你需要把return語句中的catch塊,或者你需要移動剩下的代碼放在try塊中(如果文件打開失敗,即使你發現錯誤,fileIn.HasNext肯定會失敗,因爲文件仍然沒有打開)。

我也複製並粘貼您的代碼並運行它通過一個調試器,我想你的第一個for循環是關閉的,因爲名字[I]如下:

「FOO」 //名字[i] = st.nextToken();

「foo bar」//第一次迭代名稱[i] = names [i] +「」+ st.nextToken();

「foo Bar 19.35」//名稱[i] = names [i] +「」+ st.nextToken()的第二次迭代;

的實數[I] [0],讀入整數(55),所以具有55.0 的整數[I] [0]然後被拋出異常值,因爲下一個數字是雙不是INT。

所以,你的for循環應該是:

  for (int k = 0; k<m-5; k++) 
      { 
       name = name+ " " + st.nextToken(); 
      } 
1

如果我深知,在你的榜樣

foo Bar 

你讀st.nextToken三次,而不是兩個。 也許你需要使用這樣的事情:

names[i] = ""; 

for (int k = 0; k<m-4; k++) 
{ 
    names[i] = names[i] + " " + st.nextToken(); 
} 
+0

我想要做的是設置一種方式來讀取可變數量的名稱。例如,一個名字可以是「David Jones」,下一個名字可以是「David E. Jones」。第一個st.getToken會讀入「David」,然後用m作爲總數的標記,其餘的將落入m-4(因爲有四個數值)。但也許我的計數不正確? – StillLearningToCode

+1

是的,當然你是對的,但在你的情況下m-4是2,因此名字[i]變量將被填充3個記號:[names [i] = st.nextToken()]「foo」 - > [k == 0]「foo Bar」 - > [k == 1]「foo Bar 19.35」。 –

1

刪除從您的代碼 names[i] = st.nextToken();應該正常工作。

的問題是你讀你的for循環

0

您可能需要使用String.split()先單獨標記到一個數組,然後逐一分析它們之一。

String line = "foo Bar 19.35 55 987.0054 4 "; 
String[] arr = line.split("[\s]+"); 
int m = arr.length; 

....... 
reals[i][0] = Double.parseDouble(arr[m - 4]); 

如果您對數據格式有控制權,最好使用標準CSV。