0

我试图在两个数组列表中区分和存储文本文件中的数据(点:x,y):结和零。数据文件只包含整数或十进制值。

Data File:
x    y  type(zero/knot) 
46  10      2
13  5       2
27  21      1

但我的代码抛出 NumberFormatException:48

import java.util.*;
import java.util.ArrayList;
import java.io.*;
import java.awt.Point;

public class program {

    public static void main(String []args)  {
        ArrayList knots = new ArrayList<Point>();
        ArrayList zeros = new ArrayList<Point>();
        List<Integer> list = new ArrayList<Integer>();
        String line = null;
        String file = "data1.txt";
        BufferedReader reader;
        try  {
            reader = new BufferedReader(new FileReader(file));
            while((line = reader.readLine()) != null)  {
                String tmp[] = line.split(" ");
                System.out.println(line);
                for (String s:tmp) {
                    s = s.replace("\r\n","");
                    int i = Integer.parseInt(s.trim());
                    //knots.add(new Point();
                System.out.println(s);
              }
            }
        }

        catch (FileNotFoundException e)  {
            e.printStackTrace();
        } catch (IOException e)  {
            e.printStackTrace();
        }
            }
        }
4

4 回答 4

1

假设文件内容完全...

46  10      2
13  5       2
27  21      1

当我运行你的代码时,我得到了输出......

46  10      2
46
Exception in thread "main" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:504)
    at java.lang.Integer.parseInt(Integer.java:527)
    at testparser.TestParser.main(TestParser.java:47)

这似乎表明输出中有空白/空字符串...

如果我替换此部分...

for (String s : tmp) {
    s = s.replace("\r\n", "");
    int i = Integer.parseInt(s.trim());
    //knots.add(new Point();
    System.out.println(s);
}

和...

for (String s : tmp) {
    s = s.trim();
    if (s.length() > 0) {
        int i = Integer.parseInt(s.trim());
        //knots.add(new Point();
        System.out.println(s);
    }
}

我得到...

46  10      2
46
10
2
13  5       2
13
5
2
27  21      1
27
21
1

不要忘记,readline不会返回行终止符,所以你应该可以忽略它。

line.split(" ")在每个“单独”空格上进行拆分,这意味着如果您有多个空格字符在一起,那么它将返回第二个空格...;)

相反,如果您使用String tmp[] = line.split("\\s+");,它将分割所有其他字符之间的任何空格...不返回任何“空白” String(使if (s.length() > 0) {检查变得多余)

于 2013-09-03T04:08:12.493 回答
1

问题出在你的分割线上。应该是这样String a[]=s.split(" +"); 的你的情况发生了什么:当它用 分割“46 10 2”字符串时" ",它只计算一个空格来分割字符串。所以它会忽略一个空格4610然后查找字符串。但是一个空格后面没有字符串,所以它""作为一个字符串并尝试以整数解析它。虽然""不能解析成整数,但是会抛出 NumberFormatException

于 2013-09-03T04:08:47.507 回答
0

你说你也在解析十进制数字。那些不能用Integer.parseInt(). 您需要使用Double.parseDouble()Float.parseFloat()解析字符串中的十进制值。

此外,您似乎正在尝试解析文件中的标头。确保readLine()在开始读取数据之前进行令牌调用,否则您将尝试解析文本,这没有任何意义并且会崩溃。

于 2013-09-03T04:00:02.657 回答
0

你可以试试这段代码。它对我来说很好用

import java.util.ArrayList;
import java.io.*;
import java.awt.Point;

public class program 
{
    public static void main(String []args)  
    {
        ArrayList knots = new ArrayList<Point>();
        ArrayList zeros = new ArrayList<Point>();
        List<Integer> list = new ArrayList<Integer>();
        String line = null;
        String file = "data1.txt";
        BufferedReader reader;
        try
        {
            reader = new BufferedReader(new FileReader(file));
            while((line = reader.readLine()) != null) 
            {
                String tmp[] = line.split(" ");
                System.out.println(line);
                for (String s:tmp) 
                {   
                    if(! (s.isEmpty()) )
                    {
                        int i = Integer.parseInt(s.trim());
                        System.out.println(s);
                    }
                }
            }
        }
        catch (FileNotFoundException e)  
        {
            e.printStackTrace();
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}

我希望这能帮到您。

于 2013-09-03T05:29:51.910 回答