Integer.parseint()因输入字符串大于9而失败

时间:2014-04-12 16:47:54

标签: java

我试图通过使用Integer.parseInt()将字符串转换为int - 这对输入字符串“9”很好,但是当输入字符串达到10时失败:

System.out.println("PROBLEM INT Chars:" + bf2Tokens[0].trim());
System.out.println("PROBLEM INT Bytes:" + bf2Tokens[0].trim().getBytes());
int n = Integer.parseInt(bf2Tokens[0].trim());

输出:

PROBLEM INT Chars:10
PROBLEM INT Bytes:[B@4f57011e
Exception in thread "main" java.lang.NumberFormatException: For input string: "10"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at Index.main(Index.java:281)

我也尝试过Integer.valueOf()但没有成功。

有什么建议可以在这里发生吗?

非常感谢。

2 个答案:

答案 0 :(得分:1)

问题在于特殊(不可打印)字符

这是你问题本身的输出。请再次查看bf2Tokens[0]的值。

字符串中有一些特殊的(不可打印的)字符,如下面的输出所示。

PROBLEM INT Chars:1�0
PROBLEM INT Bytes:[B@4f57011e
Exception in thread "main" java.lang.NumberFormatException: For input string: "1�0"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at Index.main(Index.java:281)

答案 1 :(得分:0)

我编译并运行了这段代码,我从你的代码中派生出来,因为你发布的代码不完整。

public class Test {
    public static void main(String[] args) {
        String[] bf2Tokens = new String[] { "10" };

        System.out.println("PROBLEM INT Chars:" + bf2Tokens[0].trim());
        System.out.println("PROBLEM INT Bytes:" + bf2Tokens[0].trim().getBytes());
        int n = Integer.parseInt(bf2Tokens[0].trim());

        System.out.println("n: " + n);
    }
}

它运行无例外,我得到以下输出:

PROBLEM INT Chars:10
PROBLEM INT Bytes:[B@2a788b76
n: 10

如您所见,我将bf2Tokens[0]设置为" 10"它完美无缺。因此,与您的想法相反,您的计划中的bf2Tokens[0]不等于" 10"。它可能看起来像10,但它不是。尝试打印它周围的引号:

System.out.println("PROBLEM INT Chars:'" + bf2Tokens[0].trim() + ');

这将有助于揭示任何前导或尾随字符。我还建议输出字符串的长度。

System.out.prinln("length: " + bf2Tokens[0].trim().length());

因为您正在使用包裹您在.trim()中解析的字符串,所以显然您没有前导空格或尾随空格。 trim的javadoc表示任何字符大于' \ u0020'将导致返回原始字符串。因此,您可能在开头或结尾处的值大于' \ u0020'