为什么 Integer.parseInt 在我的 java 代码中不起作用?
Why is the Integer.parseInt not working in my java code?
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
public class MainProgram {
public static void main(String[] args ) throws IOException{
String seconds = " ";
Scanner sc2 = null;
try {
sc2 = new Scanner(new File("/Users/mohammadmuntasir/Downloads/customersfile.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
boolean first = true;
while (sc2.hasNextLine()) {
Scanner s2 = new Scanner(sc2.nextLine());
while (s2.hasNext()) {
String s = s2.next();
if (first == true){
seconds = s;
first = false;
}
}
}
System.out.println(Integer.parseInt(seconds)); // causes ERROR?
}
}
我正在尝试从一个单独位于第一行的文本文件中读取一个数字。我创建了一个名为 seconds 的整数,它将接收第一个数字并将被解析为一个整数。但我总是收到数字异常错误,而且我无法解析它。当我将 s 显示为字符串时,它会显示一个旁边没有空格的数字。谁能解释为什么会这样?
这是堆栈跟踪:
Exception in thread "main" java.lang.NumberFormatException: For input string: "300"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at MainProgram.main(MainProgram.java:29)
如果您尝试解析 space,则会导致问题。请检查您要解析的 seconds
的值。
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:569)
at java.lang.Integer.parseInt(Integer.java:615)
at HelloWorld.main(HelloWorld.java:22)
另外尝试捕获异常并打印导致异常的值。像这样:
try{
System.out.println(Integer.parseInt(seconds));
}
catch(Exception e){
System.out.println("String value: '" + seconds + "'");
}
你能用堆栈跟踪更新问题吗?不确定文件中的内容是什么。
如果您确定读取的是整数,可以使用seconds.trim() 来trim 任何空格并解析它。
您的字符串可以为空,或者您的字符串可能包含 space。所以使用 trim 然后解析。
如果异常消息真的是这样的:
java.lang.NumberFormatException: For input string: "300"
然后我们开始研究真正晦涩的原因。
可能是同形字的问题;即 看起来像 一个字符但实际上是不同字符的 Unicode 字符。
可能是非打印字符。例如 ASCII NUL ... 或 Unicode BOM (Byte Order Marker) 字符。
我可以想到三种诊断方法:
运行 您在调试器中的代码并在 parseInt 方法上设置断点。然后查看您要解析的 String 对象,检查其长度(比如 N)和字符数组中的前 N char
个值。
使用文件工具以字节形式检查文件。 (在 UNIX / Linux / MacOSX 上,使用 od
命令。)
添加一些代码以将字符串作为字符数组获取。对于每个数组条目,将 char
转换为 int
并打印结果数。
这三种方式都应该准确地告诉您字符串中的字符是什么,这应该可以解释为什么 parseInt
认为它们是错误的。
另一种可能是您错误地复制了异常消息。当您将其放入问题时,堆栈跟踪有点混乱......
是否可以在您的代码中附加类似这样的内容并给出您的答案:
StringBuilder sb = new StringBuilder();
for (char c : seconds.toCharArray())
{
sb.append((int)c).append(",");
}
System.out.println(sb);
使用十六进制编辑器查看您的输入文件。它可能以一些称为 Byte Order Markers 的 "strange" 十六进制代码开头。这可以解释为什么异常如此具有误导性,因为 BOM 不会显示在控制台上。
你能试试这个吗,我遇到了同样的问题,Integer.ParseInt(String) 对我不起作用,我添加了 .trim() 并且效果很好:
int id_of_command;
try {
id_of_command = Integer.parseInt(id_of_Commands_str.trim());
}
catch (NumberFormatException e)
{
id_of_command = 0;
}
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
public class MainProgram {
public static void main(String[] args ) throws IOException{
String seconds = " ";
Scanner sc2 = null;
try {
sc2 = new Scanner(new File("/Users/mohammadmuntasir/Downloads/customersfile.txt"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
boolean first = true;
while (sc2.hasNextLine()) {
Scanner s2 = new Scanner(sc2.nextLine());
while (s2.hasNext()) {
String s = s2.next();
if (first == true){
seconds = s;
first = false;
}
}
}
System.out.println(Integer.parseInt(seconds)); // causes ERROR?
}
}
我正在尝试从一个单独位于第一行的文本文件中读取一个数字。我创建了一个名为 seconds 的整数,它将接收第一个数字并将被解析为一个整数。但我总是收到数字异常错误,而且我无法解析它。当我将 s 显示为字符串时,它会显示一个旁边没有空格的数字。谁能解释为什么会这样?
这是堆栈跟踪:
Exception in thread "main" java.lang.NumberFormatException: For input string: "300"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at MainProgram.main(MainProgram.java:29)
如果您尝试解析 space,则会导致问题。请检查您要解析的 seconds
的值。
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:569)
at java.lang.Integer.parseInt(Integer.java:615)
at HelloWorld.main(HelloWorld.java:22)
另外尝试捕获异常并打印导致异常的值。像这样:
try{
System.out.println(Integer.parseInt(seconds));
}
catch(Exception e){
System.out.println("String value: '" + seconds + "'");
}
你能用堆栈跟踪更新问题吗?不确定文件中的内容是什么。
如果您确定读取的是整数,可以使用seconds.trim() 来trim 任何空格并解析它。
您的字符串可以为空,或者您的字符串可能包含 space。所以使用 trim 然后解析。
如果异常消息真的是这样的:
java.lang.NumberFormatException: For input string: "300"
然后我们开始研究真正晦涩的原因。
可能是同形字的问题;即 看起来像 一个字符但实际上是不同字符的 Unicode 字符。
可能是非打印字符。例如 ASCII NUL ... 或 Unicode BOM (Byte Order Marker) 字符。
我可以想到三种诊断方法:
运行 您在调试器中的代码并在 parseInt 方法上设置断点。然后查看您要解析的 String 对象,检查其长度(比如 N)和字符数组中的前 N
char
个值。使用文件工具以字节形式检查文件。 (在 UNIX / Linux / MacOSX 上,使用
od
命令。)添加一些代码以将字符串作为字符数组获取。对于每个数组条目,将
char
转换为int
并打印结果数。
这三种方式都应该准确地告诉您字符串中的字符是什么,这应该可以解释为什么 parseInt
认为它们是错误的。
另一种可能是您错误地复制了异常消息。当您将其放入问题时,堆栈跟踪有点混乱......
是否可以在您的代码中附加类似这样的内容并给出您的答案:
StringBuilder sb = new StringBuilder();
for (char c : seconds.toCharArray())
{
sb.append((int)c).append(",");
}
System.out.println(sb);
使用十六进制编辑器查看您的输入文件。它可能以一些称为 Byte Order Markers 的 "strange" 十六进制代码开头。这可以解释为什么异常如此具有误导性,因为 BOM 不会显示在控制台上。
你能试试这个吗,我遇到了同样的问题,Integer.ParseInt(String) 对我不起作用,我添加了 .trim() 并且效果很好:
int id_of_command;
try {
id_of_command = Integer.parseInt(id_of_Commands_str.trim());
}
catch (NumberFormatException e)
{
id_of_command = 0;
}