4
public void loadFromFile(String filename) {
    File file = new File(filename);
    BufferedReader br;

    try {
        br = new BufferedReader(new FileReader(file));
        numberOfAttributes = Integer.parseInt(br.readLine());
    } 
    ...
}

以上是我的程序:我正在尝试从第一行是数字 22 的 txt 文件中读取,仅此而已。我不知道为什么程序给了我一个例外。

4

6 回答 6

7

尝试从字符串中删除任何空格:

        numberOfAttributes = Integer.parseInt(br.readLine().trim());
于 2013-04-21T19:15:10.257 回答
6

我认为您的文件开头可能有一个 UTF-8 BOM(字节顺序标记)。

这是一个重现错误的类:

import java.io.*;

public class BomTest {
    public static void main(String[] args) throws Exception {
        File file = new File("example.txt");

        // Write out UTF-8 BOM, followed by the number 22 and a newline.
        byte[] bs = { (byte)0xef, (byte)0xbb, (byte)0xbf, (byte)'2', (byte)'2', 10 };
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(bs);
        fos.close();

        BufferedReader r = new BufferedReader(new FileReader(file));
        String s = r.readLine();
        System.out.println(Integer.parseInt(s));
    }
}

当我运行这个类时,我得到以下输出:

luke@computer:~$ java BomTest 
Exception in thread "main" java.lang.NumberFormatException: For input string: "22"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.lang.Integer.parseInt(Integer.java:481)
        at java.lang.Integer.parseInt(Integer.java:514)
        at BomTest.main(BomTest.java:15)

在 Java 中处理 UTF-8 BOM 确实没有简单的方法。最好不要一开始就生成它们。另请参阅此答案

于 2013-04-21T19:57:18.173 回答
1

br.readLine()读取包括新行特殊字符在内的整行。除此之外,形成 James 建议的解决方案,您可以使用Scanner#nextInt()

于 2013-04-21T19:13:53.750 回答
0

try with numberOfAttributes = Integer.parseInt(br.readLine().trim());

public String trim()

Returns a copy of the string, with leading and trailing whitespace omitted. If this String object represents an empty character sequence, or the first and last characters of character sequence represented by this String object both have codes greater than '\u0020' (the space character), then a reference to this String object is returned.

Otherwise, if there is no character with a code greater than '\u0020' in the string, then a new String object representing an empty string is created and returned.

于 2013-04-21T19:18:53.487 回答
0

发生这种情况是因为您在输入行中有一个空格。看看这些:

int i1 = Integer.parseInt("22 ");
int i2 = Integer.parseInt("22a");
int i3 = Integer.parseInt("2 2");
int i4 = Integer.parseInt("22\n");

它们都产生异常。我建议你修剪、标记或替换。但总的来说,以这种方式从文件中读取数字对我来说并不是一个好的解决方案。如果你真的需要存储数据,为什么不创建一个临时对象并对其进行序列化/反序列化呢?

于 2013-04-21T20:04:46.863 回答
0

您的字符串中可能有一个空字符。使用正则表达式“\d+”将其删除。

引发 NumberFormatException 是因为输入字符串不是预期的数字格式。通常,您可以在错误消息中看到“错误的字符串输入”,并且可以轻松识别错误。但在您的情况下,问题在于错误消息没有完全显示字符串输入(因为它不显示空字符)。

检查以下输出和代码。

public class TestParseInt{
    private static final Pattern pattern = Pattern.compile("\\d+");
    public static void main(String []args){
       String a = "22\0";
       try {
           System.out.println("Successfull parse a: " + Integer.parseInt(a));
       } catch(NumberFormatException e) {
           System.out.println("Error:" +e.getMessage());
       }
       try {
           Matcher matcher = pattern.matcher(a);
           if(matcher.find()) {
               System.out.println("Succesfull parse a: " + 
                Integer.parseInt(matcher.group(0)));
           }

       } catch(NumberFormatException e) {
           System.out.println("Error" + e.getMessage());
       }

    }
}

输出:

错误:对于输入字符串:“22”
成功解析 a:22

于 2015-10-31T09:38:39.910 回答