【发布时间】:2010-10-05 16:30:58
【问题描述】:
我是一名 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 和应用程序继续运行时退出的可能性非常有帮助,因为即使现在对我来说也很明显,但我没有想到。
【问题讨论】:
-
哎呀,答案很快。显然是一个非常菜鸟的问题。无论如何,谢谢!
-
答案是否定的,详见此处:tshikatshikaaa.blogspot.nl/2012/07/…
标签: java error-handling finally