2011-02-03 127 views
1

我有一個文本文件,其中前兩行是整數mn,然後有m行,每行都有n管道分隔值。我寫了一個程序讀取文件,並用該文件中的值創建m*n數組,並且它在bajillion時間內正常工作,然後突然使用相同的代碼使用相同的文件,它在讀取整數時拋出NumberFormatException從第一行開始。整個代碼是在這裏:Java拋出NumberFormatException

public class Thegame extends JFrame { 
    public Integer st; 
    public Integer el; 
    public String[][] tab; 

    public Thegame(String pth) 
    { 
     setSize(640,480); 
     setTitle(pth); 
     File file = new File(pth); 
     try 
     { 
      BufferedReader rdr = new BufferedReader(new FileReader(file)); 
      st = Integer.valueOf(rdr.readLine()); 
      el = Integer.valueOf(rdr.readLine()); 
      tab = new String[st][el]; 
      for(Integer i=0; i<st; i++) 
      { 
       String lin = rdr.readLine(); 
       StringTokenizer spl = new StringTokenizer(lin,"|"); 
       for(Integer j=0; j<el; j++) 
       { 
        tab[i][j] = spl.nextToken(); 
       }     
      } 
      rdr.close();    
     } 
     catch(Exception ex) 
     { 
      JOptionPane.showMessageDialog(null, ex); 
     } 
    } 
} 

真正讓我擔心的是,同樣的代碼工作好前,突然冒出這竟然是壞的,所以我甚至不能告訴到底什麼是錯的...

+1

什麼字符串導致NumberFormatException? – templatetypedef 2011-02-03 22:11:49

回答

1

有些事情一定會改變,否則就是魔法。可能的犯罪嫌疑人:

  • 輸入文件的內容發生了變化。你用某種十六進制編輯器檢查過它嗎?文件是否確實以數字開頭?
  • Java /系統區域設置已更改。之前被視爲數字的內容不再是新語言環境中的數字。具有語言環境的典型漁獲物是數千個分隔符(,)。
1

兩個可能的問題行是:

st = Integer.valueOf(rdr.readLine()); 
el = Integer.valueOf(rdr.readLine()); 

你需要確保哪些讀者閱讀實際上是一個Integer

試試下面的小修改:

st = Integer.valueOf(rdr.readLine().trim()); 
el = Integer.valueOf(rdr.readLine().trim()); 

如果不解決這個問題,你需要確保你捕獲正確的輸入。

爲了幫助調試問題,也可能是有幫助的輸入保存到一個字符串,並打印出來,看看試圖解析它之前是什麼樣子:

String stStr = rdr.readLine().trim() 
System.out.println(stStr); 
st = Integer.valueOf(stStr); 
System.out.println(stStr); 
String elStr = rdr.readLine().trim(); 
el = Integer.valueOf(elStr); 

如果要打印的值AREN不是整數,那麼你輸入錯誤。

0

你沒有碰巧在文件的第一行之前找到一些特殊字符嗎?我知道我曾經有過這個問題,並且我花了很長時間才弄清楚發生了什麼事情。我認爲記事本++會讓你看看是否是這種情況。

0

如果行爲改變了,事情就會改變。

如果代碼沒有那麼改變之一:

  • 正在讀取的文件更改:尋找與十六進制編輯器的特殊(非可讀)字符。如果你有一個不會導致異常的輸入文件,那麼將它與那個(再次,十六進制比較)進行比較。
  • Java環境已更改:檢查Java虛擬機配置中的更改,特別是locale
0

變化:

 st = Integer.valueOf(rdr.readLine()); 
     el = Integer.valueOf(rdr.readLine()); 

String input = rdr.readLine(); 
try { 
    st = Integer.valueOf(input); 
} catch(NumberFormatException e){ 
    System.out.println("exception reading " + input); 
} 
input = rdr.readLine(); 
try { 
    el = Integer.valueOf(input); 
} catch(NumberFormatException e){ 
    System.out.println("exception reading " + input); 
} 

,你會得到你的什麼問題字符串打印出來的答案。

相關問題