读书人

BigDecimal-JDK版本差异有关问题

发布时间: 2012-11-05 09:35:12 作者: rapoo

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。

读书人网 >编程

热点推荐