当前位置:  开发笔记 > 编程语言 > 正文

在Java中,是否保证要调用"finally"块(在main方法中)?

如何解决《在Java中,是否保证要调用"finally"块(在main方法中)?》经验,为你挑选了3个好方法。

我是一个Java新手,我想知道,如果我有以下典型的Java代码

public class MyApp {
  public static void main(String[] args) {
    try {
      // do stuff
    } catch {
      // handle errors
    } finally {
      // clean up connections etc.
    }
  }
}

JVM是否保证finally块始终运行?为了理解我来自哪里,我习惯了C/C++程序,如果你取消引用一个NULL指针就可能崩溃,之后就不能运行任何代码了.

但是,由于我理解Java和整个GC /托管内存业务,所以没有空指针解除引用的东西,一切都是可捕获的预期,所以我的程序没有真正的崩溃方式可以让它跳过最后,或者在那里?例如,在Python中,我通常会这样做

try:
  # do stuff
except AnExceptionIKnewMightHappen:
  # react in an appropriate way
except:
  # log that weird error I had not known could happen

我没有通过我的代码就没有任何应用程序死亡.

当然,如果操作系统由于某种原因导致进程终止(或者如果某些东西杀死了整个系统,比如拉动插件),那么Java就无法做到.此外,从PHP我知道你无法防范的非可捕获错误,即使解释器在它发生之后仍然存在(至少它能够输出正确的消息).

编辑:为了清楚起见(这并没有被任何人误解),让我补充一点,我在寻找代码中的内容,这可能会导致最终被绕过.所以指向System.exit是一个有用的提醒,即使我不明白为什么我想要做那样的事情.

退出JVM是一种相当明显的方式,我认为这是一个外部原因.该注释指出你还必须记住在JVM和应用程序继续运行时退出的线程的可能性非常有用,因为即使现在我看起来也很明显,我没有想到它.



1> 小智..:

基本上是的,除了这里列出的注释(强调我的):

如果在执行try或catch代码时JVM退出,则finally块可能无法执行.同样,如果执行try或catch代码的线程被中断或终止,则即使应用程序作为一个整体继续,finally块也可能无法执行.


请注意,拉动电源线通常也是防止"终于"运行的好方法......
将笔记本电脑从天空刮板的顶层故事中删除也可以防止最终阻塞*和*关闭钩子!
哈哈 - 如果是笔记本电脑,笔记本电脑中的电池会在同一时刻死掉:D

2> cletus..:

不保证:

public class Main {
    public static void main(String args[]) {
        try {
            System.out.println("try");
            System.exit(0);
        } catch (Exception e) {
            System.out.println("exception");
        } finally {
            System.out.println("finally");
        }
    }
}

跑吧.


要添加我的2ct,我认为这是一个有用的提醒,即使实际上我现在想不出为什么要以这种方式退出程序,也可以使用普通代码绕过它(即没有错误)。我是Java新手,它对您有所帮助。

3> Martin McNul..:

总之,是的.

Java中finally块中的代码始终执行,除非:

JVM在try或catch块期间退出

在try或catch块期间,运行代码的线程被中断或终止

(来自:http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html)

因此,除非您显式调用System.exit(int),或者从外部终止进程或线程,否则您可以依赖它.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有