聊天讨论 请教一个 finally 语句之后的语句执行问题

jinchanchan(金蝉蝉) · 2024年06月17日 · 最后由 wellen2000 回复于 2024年06月21日 · 124 次阅读

本来初学 Java,下面是关于异常处理例子。当输入非零数字时,为何 finally 之后的语句 System.out.println("这是一个测试字符串!") 仍然会被执行? 源代码: import java.io.*; public class TestException3 { public static void main(String[] args) { int x,y,result; x=5; int a[]={0}; try { InputStreamReader reader=new InputStreamReader(System.in); BufferedReader input=new BufferedReader(reader); System.out.println("输入除数: "); y=Integer.parseInt(input.readLine()); result=x/y; System.out.println("result= "+result); a[10]=5; System.out.println("发生异常时不会被执行的语句!"); } catch(ArrayIndexOutOfBoundsException e) { System.out.println("对数组越界已经进行了处理!"); } catch(ArithmeticException e) { System.out.println("对算术异常已经进行了处理!"); } catch(Exception e) { System.out.println(e.toString()); System.out.println("对异常已经进行了处理!"); return; } finally { System.out.println("finally 语句得到执行!"); } System.out.println("这是一个测试字符串!"); } }

看代码 finally 后面的代码执行是符合预期的。 原因:

  1. catch 部分有三个,如果前面的已经被 catch 住了,后面的就不会再 catch,而是走 finally。
  2. 代码中之后最后一个 catch 块中有 return,所以如果异常被前面两个捕获,则不会执行 return,直接走 finally 及其后面的代码。

在您的代码中,无论在 try 块中有无异常发生,finally 块都会执行。这是 finally 块的一个主要特性,它保证了不论是否遇到异常,finally 块中的代码一定会被执行。

同时,您可能会好奇为什么 finally 语句块之后的 System.out.println("这是一个测试字符串!") 也能够执行。这是因为:

如果没有异常发生,程序会顺序执行到 try 块结尾,然后执行 finally 块中的代码,再继续执行 try-catch-finally 结构之后的代码。

如果有异常发生,并且该异常被某个 catch 块捕获并处理了,程序会跳到相应的 catch 块执行处理代码,然后再执行 finally 块中的代码,最后继续执行 try-catch-finally 结构之后的代码。

概要来看,System.out.println("这是一个测试字符串!") 的执行顺序可以总结为:

在 try 块中的代码,如果没有异常,顺序执行到 try 块结束。 如果 try 块中代码抛出某种异常且被某个 catch 块捕获,执行相应的 catch 块。 执行 finally 块的代码。 执行 try-catch-finally 结构之后的代码,即您提到的 System.out.println("这是一个测试字符串!")。

import java.io.*;
public class TestException3 {
    public static void main(String[] args) {
        int x,y,result;
        x=5;
        int a[]={0};
        try {
            InputStreamReader reader=new InputStreamReader(System.in);
            BufferedReader input=new BufferedReader(reader);
            System.out.println("输入除数: ");
            y=Integer.parseInt(input.readLine());
            result=x/y;
            System.out.println("result= "+result);
            a[10]=5;
            System.out.println("发生异常时不会被执行的语句!");
        } catch(ArrayIndexOutOfBoundsException e) {
            System.out.println("对数组越界已经进行了处理!");
        } catch(ArithmeticException e) {
            System.out.println("对算术异常已经进行了处理!");
        } catch(Exception e) {
            System.out.println(e.toString());
            System.out.println("对异常已经进行了处理!");
            return;
        } finally {
            System.out.println("finally 语句得到执行!");
        }
        System.out.println("这是一个测试字符串!");
    }
}
需要 登录 后方可回复, 如果你还没有账号请 注册新账号