我是一名 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 / 托管内存业务一般来说,没有空指针解引用之类的东西,一切都是可捕获的预期,所以我的程序实际上没有办法崩溃,可以让它跳过 finally ,或者有吗?例如,在 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 和应用程序继续运行时线程退出的可能性非常有帮助,因为即使现在对我来说似乎也很明显,但我没有想到这一点。