Java常见疑难问题-异常8


30. System.exit()与finally
try {
System.out.println(“Hello world”);
System.exit(0);
// 或者使用Runtime退出系统
// Runtime.getRuntime().exit(0);
} finally {
System.out.println(“Goodbyte world”);
}
上面的程序会打印出”Goodbyte world”吗?不会。

System.exit将立即停止所有的程序线程,它并不会使finally语句块得到调用,但是它在停
止VM之前会执行关闭挂钩操作(这此挂钩操作是注册到Runtime.addShutdownHook上的线
程),这对于释放VM之外的资源很有帮助。使用挂钩程序修改上面程序:
System.out.println(“Hello world”);
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
System.out.println(“Goodbyte world”);
}
});
System.exit(0);

对象回收时,使用VM调用对象的finalize()方法有两种:
System.runFinalization():该方法让机也只是尽最大努力去完成所有未执行的finalize()
终止方法,但不一定会执行。
System.runFinalizersOnExit(true):该方法一定会回收,但不安全,已被废弃。因为它可能对
正在使用的对象调用终结方法,而其他线程同时正在操作这些对象,从而导致不正确的行为
或死锁。

为了加快垃圾回收,使用System.gc(),但不一定马上执行加收动作,由机决定,实质
上是调用Runtime.getRuntime().gc()。

System的很多方法都是调用Runtime类的相关方法来实现的。
31. 递归构造
public class S {
private S instance = new S();
public S() {}
}

如果在程序外面构造该类的实例,则会抛出.lang.StackOverflowError错误。其原因是实
例变量的初始化操作将先于构造器的程序体而运行。
32. 构造器中的
如果父类构造器抛出了检测,则子类也只能抛出,而不能采用try-catch来捕获:
public class P {
public P() throws Exception {}
}

class S extends P {
public S() throws Exception {
try {
// 不能在try块中明确调用父类构造器,因为构造的
// 明确调用只能放在第一行
// !! super();
//try-catch不能捕获到父类构造器所抛出的,子类只能抛出
} catch (Exception e) {
}
}
}
如果初使化实例属性时抛出了,则构造器只能抛出,在构造器中捕获不起作用:
public class A {
private String str = String.class.newInstance();
public A()throws InstantiationException, IllegalAccessException {}
public A(int i) throws Exception{
try {

} catch (Exception e) {

}
}
}

33. StackOverflowError
机对栈的深度限制到了某个值,当超过这个值时,VM就抛出StackOverflowError。
一般VM都将栈的深度限制为1024,即当方法调用方法的层次超过1024时就会产生
StackOverflowError。

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《Java常见疑难问题-异常8
本文地址:https://www.zhiletu.com/archives-241.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微