我试图通过使用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()但没有成功。
有什么建议可以在这里发生吗?
非常感谢。
答案 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'