2

只是想知道我在这里做错了什么。我正在尝试从文件中读取并解析一些数据。我不断收到错误“java.lang.NumberFormatException”,它无法解析数字。我知道我使用 getNextDouble() 或获取 nextInt() 但我尽量保持代码通用。任何想法将不胜感激。泰。

这是我的文本文件中的一行示例:

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

4 回答 4

1

如果我理解得很好,在你的例子中

foo Bar

你读了 st.nextToken 三遍而不是两遍。可能你需要使用这样的东西:

names[i] = "";

for (int k = 0; k<m-4; k++)
{
    names[i] = names[i] + " " + st.nextToken();
}
于 2013-08-30T03:58:42.147 回答
1

names[i] = st.nextToken();从您的代码中删除 应该可以正常工作。

问题是您甚至在进入for循环之前就在阅读第一个令牌

于 2013-08-30T04:08:34.047 回答
1

在您的 try/catch 块中,您需要在 catch 块中放入 return 语句,或者您需要将其余代码移动到 try 块内(如果文件打开失败,即使您发现了错误, fileIn.HasNext 肯定会失败,因为该文件仍未打开)。

我还复制并粘贴了您的代码并通过调试器运行它,我认为您的第一个 for 循环已关闭,因为 names[i] 如下:

"foo" //names[i] = st.nextToken();

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

"foo Bar 19.35" // names[i] 第二次迭代 = names[i] + " " + st.nextToken();

reals[i][0] 然后读入整数 (55),因此值为 55.0 ints[i][0] 然后抛出异常,因为下一个数字是 double 而不是 int。

所以你的 for 循环应该是:

            for (int k = 0; k<m-5; k++)
            {
                name = name+ " " + st.nextToken();
            }
于 2013-08-30T04:10:04.227 回答
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。

于 2013-08-30T04:27:07.840 回答