NumberFormatException parseInt Java

时间:2013-09-03 03:57:26

标签: java parseint numberformatexception

我试图从两个arraylists中的文本文件中区分和存储数据(Point:x,y):knots和0。数据文件只包含整数或小数值。

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 个答案:

答案 0 :(得分: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 s(进行if (s.length() > 0) {检查冗余)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分: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();
        }
    }
}

我希望这会对你有所帮助。