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() {}
}
如果在程序外面构造该类的实例,则会抛出java.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
Java虚拟机对栈的深度限制到了某个值,当超过这个值时,VM就抛出StackOverflowError。
一般VM都将栈的深度限制为1024,即当方法调用方法的层次超过1024时就会产生
StackOverflowError。
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《Java常见疑难问题-异常8》
本文地址:http://www.xiupu.net/archives-241.html
关注公众号:
微信赞赏
支付宝赞赏