Java抛出NumberFormatException

问题描述:

我有一个文本文件,其中前两行是整数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

有些事情一定会改变,否则就是魔法。可能的犯罪嫌疑人:

  • 输入文件的内容发生了变化。你用某种十六进制编辑器检查过它吗?文件是否确实以数字开头?
  • Java /系统区域设置已更改。之前被视为数字的内容不再是新语言环境中的数字。具有语言环境的典型渔获物是数千个分隔符(,)。

两个可能的问题行是:

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不是整数,那么你输入错误。

你没有碰巧在文件的第一行之前找到一些特殊字符吗?我知道我曾经有过这个问题,并且我花了很长时间才弄清楚发生了什么事情。我认为记事本++会让你看看是否是这种情况。

如果行为改变了,事情就会改变。

如果代码没有那么改变之一:

  • 正在读取的文件更改:寻找与十六进制编辑器的特殊(非可读)字符。如果你有一个不会导致异常的输入文件,那么将它与那个(再次,十六进制比较)进行比较。
  • Java环境已更改:检查Java虚拟机配置中的更改,特别是locale

变化:

 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); 
} 

,你会得到你的什么问题字符串打印出来的答案。