Java抛出NumberFormatException
问题描述:
我有一个文本文件,其中前两行是整数m
和n
,然后有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);
}
}
}
真正让我担心的是,同样的代码工作好前,突然冒出这竟然是坏的,所以我甚至不能告诉到底什么是错的...
答
有些事情一定会改变,否则就是魔法。可能的犯罪嫌疑人:
- 输入文件的内容发生了变化。你用某种十六进制编辑器检查过它吗?文件是否确实以数字开头?
- 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);
}
,你会得到你的什么问题字符串打印出来的答案。
什么字符串导致NumberFormatException? – templatetypedef 2011-02-03 22:11:49