BigDecimal-JDK版本差异问题
java.lang.NoSuchMethodError: java.math.BigDecimal ( I)V
BigDecimal在JDK版本差异
原来程序里使用new BigDecimal(100),在JDK 1.5里多了int的构造函数
可是在1.4.2是不能执行,否则会出现以下错误:
java.lang.NoSuchMethodError: java.math.BigDecimal: method <init>(I)V not found
后来使用replace把new BigDecimal(100)改成new BigDecimal("100")才OK
网络也找到另一种解法:new BigDecimal((double) 100);
?
?
在JDK1.4 以前只有 BigDecimal ( double ),
在JDK1.5 以后新有 BigDecimal ( int ),
?
我的开发环境是jdk1.6.0_07
而执行的环境是
java version "1.4.2"
如果写成
new BigDecimal (100d);
就没问题, 问题就在他不会自动将 int 转型成 double 而是直接呼叫BigDecimal ( int ),
?
?
?
我想你作的事并不只是简单改一个输出(-target -source)的格式这样而已。当你使用 JDK 1.5 来编译并指定 -target 1.4,这样子是让产生出来的 bytecode 的版号能够让 1.4 JVM 可以接受,并不会改变使用到的 bootstrap classes(也就是说 compiler 运作时所使用的 J2SE core classes 还是 JRE 1.5 所提供的)。如果你的程序本来就是一直在 JRE 1.4 执行,那么比较大的可能是你以前都使用 JDK 1.4 来做编译,现在换成了 JDK 1.5 来编译。
?
如果说你使用的 JRE 1.4 在执行到 new BigDecimal(100); 时没有丢出 java.lang.NoSuchMethodError,那么可以说是你使用的 JRE implementation 有 bug。
?
如果实际上 JRE 会丢出 java.lang.NoSuchMethodError,但是你却认为程序没有丢出任何 exception 就死掉,这样则是你的程序没有写好。
?
至于你提到理论上 new java.math.BigDecimal(100); 经过 1.5 compiler 编译过后,拿到 JRE 1.4 执行应该没有问题,我认为你可以试着思考以下几点:
?
1. 使用 1.4 compiler 编译 new java.math.BigDecimal(100); 是由编译程序帮你产生把 100 promote 成 100.0,最后是透过 BigDecimal(double) 这个 constructor 来建构 BigDecimal object。
?
2. 你把 1.5 compiler 产生的 bytecode 拿到 JRE 1.4 来执行,这中间没有牵涉编译过程,不需要考虑同样的程序代码在 1.4 compiler 编译会是怎么样,而是要看 JVM 会怎么去解译你提供的 bytecode。
?
3. 你使用的 JRE 并不是文字(source code) level 的 interpreter。