在此代码中,即使执行catch块并引发第二个异常,是否也会设置someVar

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

推荐答案

是的,最后一个街区总是跑...除非:

  • 运行try-catch-finally块的线程被终止或中断
  • 你用System.exit(0);
  • 底层虚拟机以其他方式销毁
  • 底层硬件在某种程度上不可用

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

顺便说一句,我猜您使用的代码示例只是一个示例,但是在最终挡路中放入实际逻辑时要小心.最后的挡路用于资源清理(关闭数据库连接、释放文件句柄等),而不是用于必须运行的逻辑.如果它必须运行,那么在try 捕获挡路之前执行它,远离可能引发异常的东西,因为您的意图几乎肯定在功能上是相同的.

Java相关问答推荐

Spring MVC 控制器测试 PUT

由于非私有方法未覆盖或实现超类型中的方法,因此无法使用“<>”

TCP 发送缓冲区没有做任何事情

如何判断Java中的字符串中是否有多个字符是大写的

使用状态模式了解对象的状态

判断映射值是否包含特定字符串和受限列表中的元素

工厂设计模式在以下示例中如何帮助我们?

如何在 Databricks Spark Scala 中使用当前月份的第一天创建变量?

如何在没有长度和 indexOF 的情况下获取字符串中的信息. (JAVA)

android studio 上的 Firestore 查询未按预期工作

如何制作未经开发者许可不得转售的应用程序

如何遵循鲍勃叔叔的规则(建议)在一种方法中正确使用一个 try-catch 块?

没有@Target 的注解类型可以在任何地方使用吗?

打印所有可以使用 `+` 或 `-` 运算符给出给定数字的组合

如何使用 Math.random() 在 Java 中模拟 60% 的概率

我想返回一个异常,而我的返回类型是 Dto

Spark - 多次运行选择语句的问题

查找有向图中的所有循环,包括后边

使用字段对类的 Arraylist 进行排序

使用 Selenium 使用 sendKeys() 时,大写字母被重新排列/交换