在Java中,尝试{…}最终{…}在我看来有点不直观。如另一个问题所示,“最终是否总是在Java中执行?,如果try块中有return语句,则在定义了finally块的情况下将忽略该语句。例如功能
boolean test () {
try {
return true;
}
finally {
return false;
}
}
将始终返回false。我的问题:这是为什么?Java做出的这种设计决策背后是否有特定的哲学?我感谢任何见解,谢谢。
编辑:我对“为什么” Java认为可以违反我定义的语义特别感兴趣。如果我在try块中“返回”,则该方法应立即返回。但是JVM决定忽略我的指令,并从实际上
尚未 到达的子例程返回。
从技术上讲,return
如果 定义 了一个finally
块,则try块中的the不会被忽略,只有在该finally块中也包含一个。
__return
这是一个可疑的设计决策,回顾起来 可能是
一个错误(很像引用默认为可为空/可变,并且根据某些情况是经过检查的异常)。在许多方面,此行为与口语上对什么finally
意思的理解完全一致-“无论try
块中事先发生了什么,请始终运行此代码”。因此,如果您return true
从一个finally
障碍开始,总的效果必须总是要返回true,不是吗?
通常,这很少是一个好习惯,您应该finally
自由地使用块来清理/关闭资源,但是很少从它们返回值。
问题内容: 考虑到此代码,我是否可以 绝对确定 该块始终执行,无论它是什么? 问题答案: 是的,将在执行或代码块后调用。 唯一不会被调用的时间是: 如果您调用 如果您调用 如果JVM首先崩溃 如果JVM在或块中达到了无限循环(或其他不间断,不终止的语句) 操作系统是否强行终止了JVM进程;例如,在UNIX上 如果主机系统死机;例如,电源故障,硬件错误,操作系统崩溃等 如果该块将由守护程序线程执行并
问题内容: 我想在finally块中关闭流,但是它抛出一个,因此看来我必须在块中嵌套另一个块才能关闭流。这是正确的方法吗?似乎有点笨拙。 这是代码: 问题答案: 似乎有点笨拙。 它是。至少java7尝试使用资源可以解决该问题。 在java7之前,您可以创建一个吞咽它的函数: 或将try …最终放入try catch中: 它比较冗长,并且finally中的异常会在try中隐藏一个,但从语义上讲它更接
问题内容: 我有一个需要类似以下内容的场景 在我的尝试,我会,数据,将其与基于处理其他数据集。 在随后。有可能阻止吗?下面是伪代码: 问题答案: 无需创建表,您只需声明一个表变量(查询结束时该变量将自动消失)。
问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:
问题内容: 我在Java Web应用程序中具有以下结构: 在中WS.java,我在Web方法中使用以下代码: 但是它总是返回null。我需要读取该文件,并且我读到如果将文件放入其中,则可以使用进行访问,但是该方法始终返回null。 对我可能做错的任何想法? 它正在工作,但是当我Clean and Build在Project上执行了a之后,它突然停止工作了 问题答案: 据我所知,该文件必须正确地放置
我构建了一个api,它返回我在DB中注册的单元,但当试图返回这些单元时,这些单元并没有被检查 响应正确显示数据,如果在带有类的文件中使用,我可以设置状态,并使用返回单位 然而,我想为api返回创建这个文件,但是因为我不使用类,所以我理解我不能使用状态。 有没有办法不让类返回这些数据,或者保存一个变量或类似的东西? 或者在没有类的情况下使用? 我相信这些将是解决我的问题的方法,但是如果其他人知道,而