想一想在 JDK 1.7 之前,下面这段代码的结果是什么:
package com.hxstrive.jdk6.number; /** * 验证 JDK6 解析 “+1” 字符串 * @author hxstrive.com */ public class NumberDemo1 { public static void main(String[] args) { double x = Double.parseDouble("+1.0"); System.out.println("x = " + x); int n = Integer.parseInt("+1"); System.out.println("n = " + n); } }
如果你知道结果,那应该给自己一点奖励:+1.0 一直都表示一个有效的浮点数,但是在 Java7 之前,+1 一直不是一个有效的整数。
运行示例,结果如下:
D:\jdk1.6.0_43\bin> java Demo1 x = 1.0 Exception in thread "main" java.lang.NumberFormatException: For input string: "+1" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) at java.lang.Integer.parseInt(Integer.java:449) at java.lang.Integer.parseInt(Integer.java:499) at Demo1.main(Demo1.java:11)
JDK7 之前,“+1” 运行会报 NumberFormatException 错误。
庆幸,现在,这个问题已经在所有通过字符串来构造 int、long、short、byte 和 BigInteger 的方法中被修复了。
这个问题所影响的方法可能远远超出你的想象,除了 parse(Int|Long|Short|Byte) 方法以外,还包括处理十六进制数和八进制数输入的 decode() 方法,以及生成包装类对象的 valueOf() 方法。除此之外,构造函数 BigInteger(String) 也被修复了。
依然使用上面例子,我们试着在 JDK7+ 版本中运行一下,结果如下:
D:\Program Files\Java\jdk1.7.0_79\bin> javac Demo1.java D:\Program Files\Java\jdk1.7.0_79\bin> java Demo1 x = 1.0 n = 1