JAVA异常谜题39:您好,再见

JAVA异常谜题39:您好,再见,第1张

JAVA异常谜题39:您好,再见,第2张

下面这个程序在普通的Hello world程序上增加了一个不寻常的曲折操作。那么,它会打印什么呢?
public class Hello goodbye {
public static void main(String[]args){
try {
system . out . println(" Hello world ");
system . exit(0);
}最后{
System.out.println("再见世界");
}
}
}


这个程序包含两个println语句:一个在try语句块中,另一个在相应的finally语句块中。try语句块执行其println语句,并通过调用System.exit提前结束执行。此时,您可能希望将控制转移到finally语句块。但是,如果你运行程序,你会发现它永远不会说再见:它只打印Hello world。这是否违反了难题36中解释的原则?
无论try语句块的执行是正常结束还是意外结束,finally语句块都会执行。但是,在这个程序中,try语句块根本没有结束它的执行过程。System.exit方法将停止当前线程和所有其他立即死亡的线程。finally子句的出现并没有给予线程继续执行的特殊权限。
当调用System.exit时,虚拟机在关闭之前必须执行两个清理任务。首先,它执行所有的钩子关闭操作,这些操作已经在运行时注册了。确保关闭那些必须在VM退出之前发生的行为的挂钩。下面的程序版本演示了这种技术,可以像我们预期的那样打印出Hello world和GoodbyWorld:
public class Hello goodby 1 {
public static void main(string[]args){
system . out . println(" Hello World ");
Runtime.getRuntime()。addShutdownHook(
new Thread(){
public void run(){
system . out . println("再见世界");
}
});
system . exit(0);
}
}

VM执行调用System.exit时执行的第二个清理任务,该任务与终结器相关。如果调用System.runFinalizerOnExit或其devil twin runtime . runfinalizersonexit,则VM将对所有尚未终结的对象调用终结器。这些方法早就过时了,理由也是合理的。无论什么原因,千万不要调用System.runFinalizersOnExit和Runtime.runFinalizersOnExit:它们属于Java类库中最危险的方法之一【ThreadStop】。调用这些方法的结果是,终结器将在其他线程正在并发操作的那些对象上运行,从而导致不确定的行为或死锁。
简而言之,System.exit会立即停止所有程序线程,不会让finally语句块被调用,但会在停止VM之前执行钩子关闭操作。当虚拟机关闭时,使用shut down挂钩终止外部资源。您可以通过调用System.halt在不关闭挂钩的情况下停止VM,但是这种方法很少使用。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » JAVA异常谜题39:您好,再见

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情