我试图从两个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();
}
}
}
答案 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”字符串时,它只计算一个用于分割字符串的空格。因此它忽略46
和10
之后的一个空格,然后查找字符串。但是在一个空格之后没有字符串,因此它将""
作为字符串并尝试以整数形式解析它。虽然""
无法解析为整数,但它会抛出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();
}
}
}
我希望这会对你有所帮助。