Integer.parseInt(String)

今天在项目中碰到一个问题,就是将字符串类型转成数值类型。

以int型为例。首先自然想到的便是调用Integer类的静态方法parseInt(String)。如下三行代码(JDK版本为:1.6):

[java]
int a = Integer.parseInt("01");
int b = Integer.parseInt("-01");
int c = Integer.parseInt("+01");
[/java]

按照正常逻辑,上面的三行代码都应该没有问题。运行后的a、b、c的值应该分别是1、-1、1。然而,事实情况是第三行代码执行的时候会抛异常:NumberFormatException。

查1.6API文档,其中关于parseInt(String)方法的描述如下:

Parses the string argument as a signed decimal integer. The characters in the string must all be decimal digits, except that the first character may be an ASCII minus sign ‘-‘ (‘\u002D’) to indicate a negative value. The resulting integer value is returned, exactly as if the argument and the radix 10 were given as arguments to the parseInt(java.lang.String, int) method.
其实只说明了,负数的情况下需要有”-“,而对于正数,并没有进行说明是否可以有”+”。而事实上,是不能有”+”的,一旦有了,就会出错了。

而去看过parseInt方法的源码后便知,在parseInt方法中,只对参数的第一个字符是否为”-“进行了判断,然后对其他字符使用Character的digit方法进行转换。因此,如果参数的第一个字符是”+”的话,自然会无法转换,便抛出NumberFormatException异常了。

这可能算是java6的一个不那么完美的一个bug吧,好在这个问题在java7中已经解决了。在java7的API文档中,对parseInt这个方法的描述已经增加了关于带符号的正数的描述。如下:

Parses the string argument as a signed decimal integer. The characters in the string must all be decimal digits, except that the first character may be an ASCII minus sign ‘-‘ (‘\u002D’) to indicate a negative value or an ASCII plus sign ‘+’ (‘\u002B’) to indicate a positive value. The resulting integer value is returned, exactly as if the argument and the radix 10 were given as arguments to the parseInt(java.lang.String, int) method.