BigDecimal bug

使用jdk1.5,jdk1.6 编译成jdk1.4 的代码时,
如果使用如下代码

import java.math.BigDecimal;

 public class Test {
        public static void main(String[] args) { 
              BigDecimal dec = new BigDecimal(1); }
 }

 报错:
Exception in thread "main" java.lang.NoSuchMethodError: java.math.BigDecimal.<init>(I)V at Test.main(Test.java:6)

原因:
jdk1.5后增加了int型的构造函数,所以用jdk1.5包括jdk1.6都没有问题,即使增加-target 1.4,编译也没有问题。
但运行报构造函数不存在。


解决方案:
1.改成下面的代码
BigDecimal dec = new BigDecimal((double) 1);
2.换jdk1.4来编译

3.指定-bootclasspath 指定1.4的rt.jar

参考:
As part of jsr 13, a new constructor, BigDecimal(int val), was added to BigDecimal in JDK 5. Therefore, in 1.4 and earlier new BigDecimal(1) in the source resolves to BigDecimal(double) while in 1.5 it resolves to BigDecimal(int), which is not present in earlier JDKs. The -source flag of javac only restricts the constructs in the source languge (e.g. assert, generics); it does *not* restrict or filter the contents of the libraries. Therefore, in JDK5 if you compile with "javac -source 1.4" you will still be compiling against the 1.5 version of the libraries. Therefore, in cases like the one in this bug, code compiled at a lower language level might not be able to be used with an ealier release supporting that language level. To match both the language and libraries of an ealier jdk, use -source and the -bootclasspath flag to specify the earlier rt.jar as well. Of course the ealier jdk could be used too.

你可能感兴趣的:(BigDecimal bug)