我是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和应用程序保持运行时退出线程的可能性非常有帮助,因为即使现在看来对我来说也很明显,但我没有想到这一点。
基本上是,除了此处列出的注释(重点是我的注释):
如果在执行try或catch代码时JVM退出,则finally块 可能不会
执行。同样,如果执行try或catch代码的线程被中断或杀死,即使整个应用程序继续运行,finally块 也可能不会 执行。
问题内容: 考虑到此代码,我是否可以绝对确定该块始终执行,无论它是什么? 问题答案: 是的,将在执行或代码块后调用。 唯一不会被调用的时间是: 如果您调用 System.exit() 如果您调用 Runtime.getRuntime().halt(exitStatus) 如果JVM首先崩溃 如果JVM在try或catch块中达到了无限循环(或其他不间断,不终止的语句) 操作系统是否强行终止了JVM
问题内容: 我正在尝试了解join()的代码流。 正如我在多次运行程序后所观察到的那样,输出始终是首先执行的,并且它将在任何时候都不会进行任何上下文切换。我的理解清楚吗? 我观察到一些东西,如果不使用连接,将在线程执行的任何地方执行,这意味着我在程序的输出之间看到输出,但是总是在线程t3 之后执行。我怀疑这是语法开始之前的问题,因此它不应该跟随t3 / t1线程完成吗?这有意义还是我想念的东西?
问题内容: 我正在为Android手机的客户端/服务器应用程序设计框架。我对Java和Android都相当陌生(但对于一般的编程(尤其是线程编程)不是新的)。 有时,我的服务器和客户端将处于同一进程中,有时它们将处于不同的进程中,具体取决于确切的用例。客户端和服务器接口如下所示: IServer.aidl: IClient.aidl: 现在,这里变得有趣了。我可以预见一些用例,在这些用例中,客户端
问题内容: 在Java中,是否有一种优雅的方法可以在运行finally块之前检测是否发生了异常?在处理“ close()”语句时,通常需要在finally块中进行异常处理。理想情况下,我们希望维护两个异常并向上传播它们(因为它们都可能包含有用的信息)。我能想到的唯一方法是在try- catch-finally范围之外有一个变量,以保存对引发的异常的引用。然后将“保存的”异常与在finally块中发
问题内容: 在Python中,我有一个 模块 myModule.py,其中定义了一些函数和一个 main() ,它接受了一些命令行参数。 我通常从bash脚本中调用此main()。现在,我想将所有内容放入一个小 包装中 ,因此我想也许可以将我简单的bash脚本转换为Python脚本并将其放入包装中。 因此,实际上如何 从 MyFormerBashScript.py 的main()函数 调用 myM