Java 我错过了什么?数字格式异常错误
我想从一个只包含数字的txt文件中读取。这样的文件是UTF-8格式的,并且数字之间仅用新行分隔(没有空格或任何其他内容)。每当我调用Integer.valueOf(myString)时,我都会得到异常 这个异常非常奇怪,因为如果我创建一个预定义的字符串,比如“56\n”,并使用.trim(),它就可以正常工作。但在我的代码中,不仅不是这样,而且异常文本说它不能转换的是“54856”。我尝试在那里引入一个新行,然后错误文本说它无法转换“54856” " 这是不可能的,我错过了什么Java 我错过了什么?数字格式异常错误,java,string,file,casting,Java,String,File,Casting,我想从一个只包含数字的txt文件中读取。这样的文件是UTF-8格式的,并且数字之间仅用新行分隔(没有空格或任何其他内容)。每当我调用Integer.valueOf(myString)时,我都会得到异常 这个异常非常奇怪,因为如果我创建一个预定义的字符串,比如“56\n”,并使用.trim(),它就可以正常工作。但在我的代码中,不仅不是这样,而且异常文本说它不能转换的是“54856”。我尝试在那里引入一个新行,然后错误文本说它无法转换“54856” " 这是不可能的,我错过了什么 File fic
File ficherentrada=新文件(“C:\\in.txt”);
FileReader entrada=新的FileReader(FicherEntrada);
BufferedReader输入=新的BufferedReader(entrada);
字符串s=input.readLine();
系统输出打印项次;
整数;
in=整数.valueOf(s.trim());
系统输出打印项次(输入);
例外案文如下:
Exception in thread "main" java.lang.NumberFormatException: For input string: "54856"
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
at java.base/java.lang.Integer.parseInt(Integer.java:658)
at java.base/java.lang.Integer.valueOf(Integer.java:989)
at Quicksort.main(Quicksort.java:170)
.txt中的文件包括:
54856
896
54
53
2
5634
很可能您的输入中有一个
前导/尾随空格
,类似于:
String s = " 5436";
System.out.println(s);
Integer in;
in = Integer.valueOf(s.trim());
System.out.println(in);
54856\n
896
54\n
53
2\n
5634
对字符串使用trim()
UPDATE 2:
如果您的文件包含以下内容:
String s = " 5436";
System.out.println(s);
Integer in;
in = Integer.valueOf(s.trim());
System.out.println(in);
54856\n
896
54\n
53
2\n
5634
然后对其使用以下代码:
....your code
FileReader enter = new FileReader(file);
BufferedReader input = new BufferedReader(enter);
String currentLine;
while ((currentLine = input.readLine()) != null) {
Integer in;
//get rid of non-numbers
in = Integer.valueOf(currentLine.replaceAll("\\D+",""));
System.out.println(in);
...your code
若要确保字符串的可解析性,可以使用模式和正则表达式
Pattern intPattern = Pattern.compile("\\-?\\d+");
Matcher matcher = intPattern.matcher(input);
if (matcher.find()) {
int value = Integer.parseInt(matcher.group(0));
// ... do something with the result.
} else {
// ... handle unparsable line.
}
此模式允许任何数字,也可以选择在前面加一个负号(不带空格)。它应该明确解析,除非太长。我不知道它是如何处理的,但您的示例似乎大多包含短整数,所以这不重要。好吧,很可能它与Windows和它使用的那些\r\n有关。。。我只是试着在Linux虚拟机上执行它,结果成功了。感谢所有回答的人 尝试使用Scanner
类读取文件,并使用它的hasnetint()
方法来确定您正在读取的是整数
。这将帮助您找出导致问题的字符串/字符
public static void main(String[] args) throws Exception {
File ficheroEntrada = new File(
"C:\\in.txt");
Scanner scan = new Scanner(ficheroEntrada);
while (scan.hasNext()) {
if (scan.hasNextInt()) {
System.out.println("found integer" + scan.nextInt());
} else {
System.out.println("not integer" + scan.next());
}
}
}
如果这在Windows下,回车符也可能在字符串中('\r'
)。可能是隐藏字符?尝试使用Arrays.toString
打印字符串中的字符数组。输入的对象是什么类型的input
?你能告诉我们你在哪里创建它吗?你能检查一下字符串中字符的序号吗?这些可能是ascii范围之外的unicode字符吗?0-9通常应该在ascii内部,但可能这些不是默认的0-9字符。我可以帮助包括打印输出,比如System.out.println(“…”+s+”)
,奇怪的是trim没有删除\r
是的,我指定使用trim时,错误仍然存在。这就是让我困惑的地方。你能给我们看看你的档案内容吗@查看我的更新代码Alberto,并在Windows中尝试@阿尔贝托萨罗斯