`
Copperfield
  • 浏览: 260179 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
C407adc3-512e-3a03-a056-ce4607c3a3c0
java并发编程陷阱
浏览量:25137
社区版块
存档分类

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。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics