Integer.parseInt 失败 'For input string: "5000"'

Integer.parseInt failing 'For input string: "5000"'

我承认,我很难过。这不是双打。它不在整数范围之外。这不是南。据我所知,它不是任何形状或形式的非整数。

为什么我会收到那个错误?

这是导致它的代码:

String filename = "confA.txt";

//Make a new filereader to read in confA
FileReader fileReader = new FileReader(filename);

//Wrap into a bufferedReader for sanity's sake
BufferedReader bufferedReader = new BufferedReader(fileReader);

//Get the port number that B is listening to
int portNum = Integer.parseInt(bufferedReader.readLine());

最后一行失败,说明:

java.lang.NumberFormatException: For input string: "5000"

我要哪个号码。

我也试过

Integer portNum = Integer.parseInt(bufferedReader.readLine());

但这也没有用。 valueOf().

也没有

很可能在您的文件行中某处有一些无法打印的字符。请考虑以下示例(已在 Java 9 jshell 中测试)

jshell> String value = "5000\u0007";
value ==> "5000[=10=]7"

jshell> Integer.parseInt(value);
|  java.lang.NumberFormatException thrown: For input string: "5000"
|        at NumberFormatException.forInputString (NumberFormatException.java:65)
|        at Integer.parseInt (Integer.java:652)
|        at Integer.parseInt (Integer.java:770)
|        at (#15:1)

此处字符串末尾包含 "bell" 字符。当它没有打印在异常文本中时,它会使解析失败。我想你有类似的东西。验证这一点的最简单方法是检查

String line = bufferedReader.readLine();
System.out.println("line length: " + line.length());

4以外的值会支持我的想法。

我遇到了同样的问题。我正在读取带有缓冲 reader 的平面文件并将内容保存为字符串类型的 ArrayList,但是在从列表中检索字符串值时执行 integer.parse 时,我意识到有一个从文件中读取的字符串中有很多垃圾,因为我得到了 java.lang.NumberFormatException.

这是我用代码实现的方法(从我的主要方法调用)来解决问题:

` // class 级别

    private static final Pattern numericPattern = Pattern.compile("([0-9]+).([\\.]{0,1}[0-9]*)");

    // in main method after reading in the file
    String b = stripNonNumeric(stringvaluefromfile);
    int a = Integer.parseInt(b);

    public static String stripNonNumeric(String number) {

    //System.out.println(number);

    if (number == null || number.isEmpty()) {
        return "0";
    }

    Matcher matcher = numericPattern.matcher(number);

    // strip out all non-numerics
    StringBuffer sb = new StringBuffer("");
    while (matcher.find()) {
        sb.append(matcher.group());
    }

    // make sure there's only one dot
    int prevDot = -1;
    for (int i = sb.length() - 1; i >= 0; i--) {
        if (sb.charAt(i) == '.') {
            if (prevDot > 0) {
                sb.deleteCharAt(prevDot);
            }
            prevDot = i;
        }
    }

    if (sb.length() == 0) {
        sb.append("0");
    }

    return sb.toString();
}`