论坛首页 Java企业应用论坛

遇到这3道笔试题,大家有把握能做对几道

浏览 33655 次
精华帖 (16) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (8)
作者 正文
   发表时间:2011-08-11  
测试答案是d  仔细看控制台输出,,里面会有少量的catch 打印出来
0 请登录后投票
   发表时间:2011-08-11  
lenshon 写道
ucfjepl 写道
private boolean f = false;
	
	public void test(int i) {
		i++;
		try {
			System.out.println("try"+i);
			if(!f)test(i);
		} catch (Error e) {
			e.printStackTrace();
			System.out.println("catch"+i);
			f=true;
		} finally {
			System.out.println("finally"+i);
			if(!f)test(i);
		}
	}

	public static void main(String[] args) {
		Test t = new Test();
		t.test(0);
	}

   我把catch的类型改了一下,这样我们就可以看到异常了,异常类型是java.lang.StackOverflowError。
我们看不到异常的原因就在于此,实际jvm已经抛出了异常,只是catch的类型不对应,这样catch就不执行而是直接执行finally,所以我们看到控制台一直输出

try和finally。
当我们debug的时候,会看到一直输出的try,原因是jvm此时还没有堆栈深度溢出,我们看到的finally是jvm执行无数个try后的结果,我在eclipse中测试时再catch中加了个断点,程序执行5000多次后开始抛出异常,不知道我的理解对不对,等待高手解决。

 

java.lang 
类 Throwable

java.lang.Object
  继承者 java.lang.Throwable
所有已实现的接口:
Serializable
直接已知子类:
ErrorException


Error 不是Runnable的子类吗,为什么扑捉不到...

 

我重新测试了一下,在catch里面了设置了一个断点,然后debug,如果是Error的话,很快就会执行到catch里面,但是用throwable的话一直等到eclipse崩溃掉都没有看到进入catch,很不解。

0 请登录后投票
   发表时间:2011-08-15  
liuningbo 写道
关于第二题,不管执行多少遍都没有没有新对象,所以不会栈溢出的吧,答案是C

会出现栈溢出,非基础类型的数据,是要占据两块内存空间的。String类型的常量 是属于对象类型的,也就是每执行一遍循环,就会在stack segment 中创建一个引用类型的变量指向 这个常量,数量多了,应该会出现 stack 内存溢出的。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics