Java 是否存在finally块不执行的情况
与Java异常处理相关的问题在许多公司的面试中以及考试中都是最常见的。面试官可能会问其中一个问题是,在Java中是否存在finally块不执行的情况。我们将尽可能简单地找出这个问题的答案。通常情况下,finally块设计为无论在try-catch块中是否抛出或处理异常,都会执行。
在Java中是否存在finally块不执行的情况
在回答这个问题之前,有必要先讨论Java异常处理。
Java中的异常处理
在Java中,异常是表示错误的对象。发生的错误会中断代码块的正常执行流程,这就是为什么我们需要处理这些异常的原因,以及我们处理这些意外错误的机制称为异常处理。
常见的异常示例包括ClassNotFoundException、FileNotFoundException、IOException等。
异常处理机制使用以下五个内置关键字
- try - 包含可能引发异常的代码块。
-
catch - 用于处理try块抛出的异常。
-
throw - 用于显式地抛出单个异常。
-
throws - 可以抛出多个异常。
-
finally - 包含必须执行的关键代码块。
try块的可能组合
-
try-catch
-
try-finally
-
try-catch-finally
示例
以下示例展示了try、catch和finally块的实际实现。
public class Finally {
public static void main(String[] args) {
try { // declaring try block
System.out.println("Execution of Try block");
} catch(Exception exp) { // defining catch block
System.out.println(exp);
}
finally { // declaring finally block
System.out.println("Execution of finally block");
}
}
}
输出
Execution of Try block
Execution of finally block
在上面的代码中,我们可以看到try块和finally块被执行,但是catch块没有被执行。
finally块
上面的示例表明,无论是否发生异常,finally块都将被执行。然而,存在一些情况下finally块可能不会执行。
finally块可能不会执行的情况
- 当我们在try或catch块内调用System.exit()时。
-
当JVM遇到非终止代码时。
让我们通过示例来理解这些点。
示例
在这个示例中,我们将在try块内调用System.exit()来限制finally块的执行。当JVM遇到System.exit()时,程序将从那一点终止,因此finally块不会被执行。
public class Finally {
public static void main(String[] args) {
try { // declaring try block
System.out.println("Execution of Try block");
System.exit(0); // to terminate the program
} catch(Exception exp) { // defining catch block
System.out.println(exp);
}
finally { // declaring finally block
System.out.println("Execution of finally block");
}
}
}
输出
Execution of Try block
示例
在以下示例中,我们使用了一个while循环,以及一个在try块内部为true的布尔值,这将创建一个无限循环。这种情况将阻止finally块的执行。
public class Finally {
public static void main(String[] args) {
try { // declaring try block
while (true) { // infinite loop
// intentionally left blank
}
} catch(Exception exp) { // defining catch block
System.out.println(exp);
}
finally { // declaring finally block
System.out.println("Execution of finally block");
}
}
}
上述代码不会生成任何输出。
结论
从上面的讨论中,我们可以得出通常情况下finally块的执行总是会发生。然而,我们可以创建一些情况来限制其执行。在本文中,我们通过示例程序分享了两种这样的场景。