我想念什么? NumberFormatException错误

时间:2019-04-08 09:25:30

标签: java string file casting

我想从仅包含数字的txt文件中读取。这样的文件位于UTF-8中,数字仅由换行符(无空格或其他任何东西)分隔。每当我调用Integer.valueOf(myString)时,我都会收到异常。

这个异常真的很奇怪,因为如果我创建一个预定义的字符串,例如“ 56 \ n”,并使用.trim(),它会完美地工作。但是在我的代码中,不仅不是这种情况,而且异常文本指出,它无法转换的是“ 54856”。我尝试在此处引入新的一行,然后错误文本说它无法转换“ 54856 ” 毫无疑问,我想念什么?

File ficheroEntrada = new File("C:\\in.txt");
FileReader entrada =new FileReader(ficheroEntrada);
BufferedReader input = new BufferedReader(entrada);

String s = input.readLine();
System.out.println(s);
Integer in;
in = Integer.valueOf(s.trim());
System.out.println(in);

异常文本如下:

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)

in.txt文件包含:

54856
896
54
53
2
5634

4 个答案:

答案 0 :(得分:2)

好吧,显然它与Windows以及它所使用的\ r有关...我只是尝试在Linux VM上执行它,并且它起作用了。感谢所有回答的人!

答案 1 :(得分:1)

尝试使用Scanner类读取文件,该类已使用它的hasNextInt()方法来识别您正在读取的内容是Integer。这将帮助您找出导致此问题的字符串/字符

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());
        }
    }
}

答案 2 :(得分:0)

很可能您输入的内容中有一个leading/trailing whitespaces,例如:

String s = " 5436";
System.out.println(s);
Integer in;
in = Integer.valueOf(s.trim());
System.out.println(in);

在字符串上使用trim()可以消除它。

UPDATE 2:

如果您的文件包含以下内容:

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

答案 3 :(得分:0)

如果要确保字符串的可解析性,可以使用Pattern和Regex。

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.
}

此模式允许任何数字,也可以选择一个负号(不带空格)。除非时间太长,否则应该明确地进行解析。我不知道它是如何处理的,但是您的示例似乎主要包含短整数,因此这无关紧要。