为这个虚拟机写测试例子

应panqj_hust的需要,我举例说明如何为这个虚拟机写测试例子。我在开发这个虚拟机的过程中,为了检查是否正确,也写了好些测试Java类。这些例子很多,不在这里一一列举出来。我只是举一两个例子,说明怎么写测试例子。实际上不难写。

例子1:


class Ball extends Exception
{
}

class Pitcher {

private static Ball ball = new Ball();

public static void main(String[] args) {
main();
}

public static void main() {
playBall();
}

static void playBall() {
int i = 0;
for (;;) {
try {
if (i % 4 == 3) {
throw ball;
}
++i;
} catch (Ball b) {
i = 0;
}
}
}

}


这个例子我是摘自“深入Java虚拟机”,除了增加了main()方法,好让我的虚拟机可以执行外,其它没有什么改动。(注意,我的虚拟机版本暂时不支持main(String[])方法启动,只支持main()方法启动)

先用javac编译Ball和Pitcher。然后用g++编译我的虚拟机版本(编译命令参考下载包里面的compile.txt)。运行虚拟机,假设可执行程序名为JVMTest2.exe(Windows上),运行命令如下:
JVMTest2.exe -d4 Pitcher
那么你就会看到详细的输出。可选参数-d4控制调试信息的输出详细程度。d4已经是很详细了,你也可以用d0,d1,d2,d3。如果d0的话,可能什么信息也没有输出,除了程序发生错误时的异常信息。

上面这个例子是一个“扔球游戏”,而且永远不会结束。这个例子正常运行起来,至少能说明:a.类的初始化方法<clinit>确实被调用了,在这里类的初始化,new了一个Ball的实例。b.异常抛出和处理确实执行了。因为这个例子不断地抛出和捕捉异常。d4参数会导致详细的信息输出来,如果你足够耐心,可以观看分析这些输出,细到每个指令的执行结果,都输出来了。(对于这个例子,因为是死循环,我在调试器里设置断点调试跟踪,就知道了虚拟机执行是否正确)

再举一个例子,这个例子请参考我前面的一篇文章:
[url]
http://simpleman7210.iteye.com/blog/1953969
[/url]


在这个例子中,有两个类Subclass和Superclass。运行这个例子:
JVMTest2.exe -d4 Subclass
这个例子若被正确执行,至少能说明这样几点:invokespecial指令被正确执行了,invokevirtual指令被正确执行了。

倘若一个类有自己的包名,运行的时候要指出类的全名称,比如:
JVMTest2.exe -d4 test/arithmetic/ClassTestArithmeticOperations
这里ClassTestArithmeticOperations是一个Java类,在包test/arithmetic下面。在我这个虚拟机中,包名之间用斜杠'/'而不是点号'.',这只是因为一时的方便,暂时没有支持点号。

ClassTestArithmeticOperations是我写的一个测试例子,用来检查加减乘除指令实现的正确性,其代码如下。

package test.arithmetic;

public class ClassTestArithmeticOperations
{
public static void main(String[] args) {
main();
}

public static void main() {
int i1 = 10;
int i2 = 20;
int i3 = i1 + i2;
int i4 = i1 - i2;
int i5 = i1 * i2;
int i6 = i1 / i2;
long l1 = 12345678901L;
long l2 = 10000L;
long l3 = l1 + l2;
long l4 = l1 - l2;
long l5 = l1 * l2;
long l6 = l1 / l2;
float f1 = 0.12345f;
float f2 = 0.00001f;
float f3 = f1 + f2;
float f4 = f1 - f2;
float f5 = f1 * f2;
float f6 = f1 / f2;
double d1 = 0.12345;
double d2 = 0.00001;
double d3 = d1 + d2;
double d4 = d1 - d2;
double d5 = d1 * d2;
double d6 = d1 / d2;
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值