我正在使用摩托罗拉 FX9500 RFID 阅读器,它运行带有jamvm 1.5.0 版的 Linux(我只能向其部署应用程序 - 我无法更改 Java VM 或任何东西,因此我的选择受到限制) - 这就是我看到的我检查版本:
[cliuser@FX9500D96335 ~]$ /usr/bin/jamvm -version
java version "1.5.0"
JamVM version 1.5.4
Copyright (C) 2003-2010 Robert Lougher <rob@jamvm.org.uk>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2,
or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
Build information:
Execution Engine: inline-threaded interpreter with stack-caching
Compiled with: gcc 4.2.2
Boot Library Path: /usr/lib/classpath
Boot Class Path: /usr/local/jamvm/share/jamvm/classes.zip:/usr/share/classpath/glibj.zip
我需要编写一个应用程序,因此我获取了 Oracle Java SDK 1.5.0 并将其安装到我的 Windows 7 PC 上,因此它具有以下版本:
C:\>javac -version
javac 1.5.0
考虑到我用该编译器编译的应用程序可以在上述 JamVM 上正常工作,我是不是过于理想化了?无论如何,我在无知中继续写这个小应用程序:
public final class TestApp {
public static void main(final String[] args) {
long p = Long.MIN_VALUE;
int o = (int)(-(p + 10) % 10);
System.out.println(o);
}
}
使用前面提到的 javac 编译器对其进行编译并在 PC 上运行,如下所示:
C:\>javac TestApp.java
C:\>java TestApp
8
那里一切都好。生活是美好的,所以我把那个.class
文件放在FX9500上,然后像这样运行它:
[cliuser@FX9500D96335 ~]$ /usr/bin/jamvm TestApp
-2
哎呀,什么......正如你所看到的 - 它返回不同的结果。
那么,为什么以及谁错了,或者像规范一样不清楚如何处理这个计算(肯定不是)?难道是我需要用不同的编译器编译它?
我为什么要关心这个?
我遇到这种情况的原因是内部发生了完全一样的计算,java.lang.Long.toString
并且我的实际应用程序中有一个错误,我正在注销很长一段时间并获得java.lang.ArrayIndexOutOfBoundsException
. 因为我想要记录的值很可能在Long
.
我想我可以通过检查 Long.MIN_VALUE 和 Long.MAX_VALUE 并记录“错误,我不能告诉你这个数字,但它真的是 Long.XXX,相信我,我会骗你吗?”来解决这个问题。但是当我发现这一点时,我觉得我的应用程序现在是建立在一个坚实的基础上的,它需要非常健壮。我正在认真考虑只是说 JamVM 不能胜任这项工作并用 Python 编写应用程序(因为读者也有 Python 运行时)。
我有点希望有人告诉我我是个笨蛋,我应该像....那样在我的 Windows PC 上编译它,然后它会起作用,所以请告诉我(如果这是真的,当然) !
更新
Noofiz 让我思考(谢谢),我敲开了这个额外的测试应用程序:
public final class TestApp2 {
public static void main(final String[] args) {
long p = Long.MIN_VALUE + 10;
if (p != -9223372036854775798L) {
System.out.println("O....M.....G");
return;
}
p = -p;
if (p != 9223372036854775798L) {
System.out.println("W....T.....F");
return;
}
int o = (int)(p % 10);
if (o != 8) {
System.out.println("EEEEEK");
return;
}
System.out.println("Phew, that was a close one");
}
}
我再次在 Windows 机器上编译并运行它。
它打印Phew, that was a close one
我将.class
文件复制到有问题的装置并运行它。
它打印...
……等等……
W....T.....F
哦亲爱的。我有点头晕,我想我需要一杯茶...
更新 2
我尝试的另一件事没有任何区别,是将 FX9500 上的 classes.zip 和 glibj.zip 文件复制到 PC,然后像这样进行交叉编译(这一定意味着编译后的文件应该没问题对?):
javac -source 1.4 -target 1.4 -bootclasspath classes.zip;glibj.zip -extdirs "" TestApp2.java
但是生成的 .class 文件在阅读器上运行时会打印相同的消息。