当前位置: 首页 > 面试题库 >

即使抛出新的Exception,finally块也会运行吗?

闻人冷勋
2023-03-14
问题内容

someVar即使执行catch块并抛出第二个Exception,也会在此代码中进行设置?

public void someFunction() throws Exception {
    try {
        //CODE HERE
    } catch (Exception e) {
        Log.e(TAG, "", e);
        throw new Exception(e);
    } finally {
        this.someVar= true;
    }
}

问题答案:

是的,finally块始终运行…除非以下情况:

  • 运行try-catch-finally块的线程被杀死或中断
  • 你用 System.exit(0);
  • 基础虚拟机以其他方式被破坏
  • 基础硬件在某种程度上无法使用

另外,如果您的finally块中的方法抛出未捕获的异常,则此后将不执行任何操作(即,该异常将像在其他任何代码中一样被引发)。发生这种情况的一个非常常见的情况是java.sql.Connection.close()

顺便说一句,我想您所使用的代码示例只是一个示例,但是请小心将实际逻辑放入finally块中。finally块用于资源清理(关闭数据库连接,释放文件句柄等),而不用于必须运行的逻辑。如果必须运行,请在try-
catch块之前执行此操作,避免可能引发异常的操作,因为您的意图几乎肯定在功能上是相同的。



 类似资料:
  • 问题内容: 如果catch和finally块都抛出异常会怎样? 问题答案: 当该块引发异常时,它将有效地隐藏从该块引发的异常,并将最终引发该异常。因此,重要的是要么在捕获时记录异常,要么确保finally块本身不会引发异常,否则,您将得到被扼杀且从未见过的异常​​。

  • 问题内容: 即使我单击常规的“运行”按钮,Eclipse始终以调试模式启动我的应用程序。 有任何想法吗? 问题答案: 我发现必须重新启动Xoom才能使其再次正常运行。

  • 问题内容: 这是原始代码 这里私有的int x,y不是最终值是很好的,因为构造函数中的set方法会在调用get时在关系发生之前发生,因为它们使用相同的锁。 现在,这里是修改后的版本和主要方法,由于在set方法中删除了synced关键字,因此我希望在运行它后再抛出AssertionError。如果有人指出它不是线程安全的,那我就将构造函数私有化为唯一的调用者,这不是我关注的重点。 无论如何,我现在已

  • 问题内容: 我有一个包含10个元素的div,这些元素将被逐个更新,延迟时间为2秒。下面是相同的代码 但是,当我运行它时,所有元素都会一起更新。该程序只是添加一个延迟添加一个开始,并且所有元素都一起更新(被标记)。如何制作代码来逐一标记元素? 问题答案: 您正在打破React的两个基本规则: 不要直接改变状态 如果根据现有状态更新状态,请使用回调形式,因为状态更新可能是异步的(无论如何,在您的示例中

  • 问题内容: 我正在编写一个(貌似)简单明了的SQL代码段,该代码段在确保该列存在之后将其删除。 问题:如果列不存在,代码 内 IF子句抱怨说,它无法找到列!好了, 卫生署 ,这就是为什么它的IF子句中! 所以我的问题是,为什么不应该执行的一段代码会出现错误? 这是代码段: …这是错误: 我正在使用Microsoft SQL Server 2005 Express Edition。 问题答案: IF

  • 问题内容: 我有一个带有IF-ELSE块的SQL代码。IF部分中的代码不应该到达,但是在执行SQL时仍然出现错误。在我首先测试链接服务器的代码中,当它失败时,将其设置为1,并且该块应执行并避免需要查询链接服务器的块中的代码,但是出现此错误: 我正在SSMS 2012中运行查询。为什么会发生此错误? -下列插入SQL语句导致错误 问题答案: 在执行之前,它仍然会解析并绑定所有内容。它没有绑定到这里。