只是想知道我在这里做错了什么。我试图从文件中读取并解析一些数据。我一直收到错误" 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 :(得分:1)
如果我理解得很好,在你的例子中
foo Bar
你读了st.nextToken三次而不是两次。 可能你需要使用这样的东西:
names[i] = "";
for (int k = 0; k<m-4; k++)
{
names[i] = names[i] + " " + st.nextToken();
}
答案 1 :(得分:1)
卸下
你代码中的names[i] = st.nextToken();
应该可以正常工作。
问题是你在进入for
循环
答案 2 :(得分:1)
在你的try / catch块中,你需要在catch块中放入一个return语句,或者你需要将其余的代码移到try块内(如果文件打开失败,即使你被抓住了错误,fileIn.HasNext肯定会失败,因为文件仍然没有打开。)
我还复制并粘贴了你的代码并通过调试器运行它,我认为你的第一个for循环是关闭的,因为name [i]如下:
“foo”// names [i] = st.nextToken();
“foo bar”//名字的第一次迭代[i] = names [i] +“”+ st.nextToken();
“foo Bar 19.35”//名称的第二次迭代[i] = names [i] +“”+ st.nextToken();
然后,实数[i] [0]读入整数(55),因此值为55.0 然后ints [i] [0]抛出异常,因为下一个数字是double而不是int。
所以你的for循环应该是:
for (int k = 0; k<m-5; k++)
{
name = name+ " " + st.nextToken();
}
答案 3 :(得分: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。