NumberFormatException parseInt Java

NumberFormatException parseInt Java,java,parseint,numberformatexception,Java,Parseint,Numberformatexception,我试图将文本文件中的数据(点: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.Poi

我试图将文本文件中的数据(点: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();
        }
            }
        }
import java.util.*;
导入java.util.ArrayList;
导入java.io.*;
导入java.awt.Point;
公共课程{
公共静态void main(字符串[]args){
ArrayList节点=新的ArrayList();
ArrayList zeros=新的ArrayList();
列表=新的ArrayList();
字符串行=null;
String file=“data1.txt”;
缓冲读取器;
试一试{
reader=newbufferedreader(newfilereader(file));
而((line=reader.readLine())!=null){
字符串tmp[]=line.split(“”);
系统输出打印项次(行);
for(字符串s:tmp){
s=s.replace(“\r\n”,”);
inti=Integer.parseInt(s.trim());
//添加(新点();
系统输出打印项次;
}
}
}
catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}

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


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

假设文件内容正是

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)
这似乎表明输出中存在空白/空字符串

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+)0){
check redundant),它将在所有其他字符之间的任何空格上拆分…不返回任何“空白”
String
s(使
if(s.length()>0){
check redundant)

问题出在拆分行中。它应该是这样的
String a[]=s.split(+)

您的情况是:当它用
拆分“46 10 2”字符串时,
只计算拆分字符串的一个空格。因此,它忽略
46
10
之后的一个空格,然后查找字符串。但一个空格之后没有字符串,因此需要
“”
作为字符串,并尝试用整数解析它。虽然
无法解析为整数,但它会引发NumberFormatException

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

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();
        }
    }
}
import java.util.ArrayList;
导入java.io.*;
导入java.awt.Point;
公共课程
{
公共静态void main(字符串[]args)
{
ArrayList节点=新的ArrayList();
ArrayList zeros=新的ArrayList();
列表=新的ArrayList();
字符串行=null;
String file=“data1.txt”;
缓冲读取器;
尝试
{
reader=newbufferedreader(newfilereader(file));
而((line=reader.readLine())!=null)
{
字符串tmp[]=line.split(“”);
系统输出打印项次(行);
for(字符串s:tmp)
{   
如果(!(s.isEmpty())
{
inti=Integer.parseInt(s.trim());
系统输出打印项次;
}
}
}
}
catch(filenotfounde异常)
{
e、 printStackTrace();
}
捕获(IOE异常)
{
e、 printStackTrace();
}
}
}

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

这可能是由于您的文件头行吗?因此,“x y类型(零/结)”行实际上不在文件中?您正在尝试查找字符串是的,“x y类型”现在不在文件中,我只是想做整数值,我有两个独立的数据文件。那么我第二段中的建议可能适用,但在阅读另一个文件时,了解如何解析浮点值是很重要的。“x y type”仅用于说明,它不在实际文件中。@user2398101很高兴我能提供帮助