finally语句

finally语句

 

finally的用法:只能用在try/catch语句中,并且附带着一个语句块,表示这段语句最终总是被执行。请看下面的代码:

public final class FinallyTest {

    public static void main(String[] args) {
        try {
            throw new NullPointerException();
        } catch (NullPointerException e) {
            System.out.println("程序抛出了异常");
        } finally {
            System.out.println("执行了finally语句块");
        }
    }

}

运行结果说明了finally的作用:

1. 程序抛出了异常

2. 执行了finally语句块

 

有没有一种情况使finally语句块得不到执行呢?大家可能想到了return、continue、break这三个可以打乱代码顺序执行语句的规律。那我们就来试试看,这三个语句是否能影响finally语句块的执行:

public final class FinallyTest {

    // 测试return语句
    public ReturnClass testReturn() {
        try {
            return new ReturnClass();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("执行了finally语句");
        }
        return null;
    }

    // 测试continue语句
    public void testContinue() {
        for (int i = 0; i < 3; i++) {
            try {
                System.out.println(i);
                if (i == 1) {
                    continue;
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                System.out.println("执行了finally语句");
            }
        }
    }

    // 测试break语句
    public void testBreak() {
        for (int i = 0; i < 3; i++) {
            try {
                System.out.println(i);
                if (i == 1) {
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                System.out.println("执行了finally语句");
            }
        }
    }

    public static void main(String[] args) {
        FinallyTest ft = new FinallyTest();
        // 测试return语句
        ft.testReturn();
        System.out.println("----------return over----------");
        // 测试continue语句
        ft.testContinue();
        System.out.println("----------continue over----------");
        // 测试break语句
        ft.testBreak();
        System.out.println("----------break over----------");
    }
}

 

public class ReturnClass {
    public ReturnClass() {
        System.out.println("执行了return语句");
    }
}

上面这段代码的运行结果如下:

执行了return语句

执行了finally语句

----------return over----------

0

执行了finally语句

1

执行了finally语句

2

执行了finally语句

----------continue over----------

0

执行了finally语句

1

执行了finally语句

----------break over----------

 

return、continue和break都没能阻止finally语句块的执行。

从输出的结果来看return语句是在finally语句块之后执行的,也就是说finally语句块是在程序退出方法之前被执行的。同样,finally语句块是在循环被跳过(continue)和中断(break)之前被执行的。

### C# 中 try-finally 语句的用法和工作机制 #### 1. 基本概念 `try-finally` 是 C# 中用于异常处理的一种结构。无论是否发生异常,`finally` 块中的代码都会被执行。这种机制确保了在执行某段代码时,无论结果如何,都可以执行重要的清理操作[^3]。 #### 2. 语法结构 `try-finally` 的基本语法如下: ```csharp try { // 可能引发异常的代码 } finally { // 必须执行的代码 } ``` #### 3. 工作机制 - `try` 块中包含可能引发异常的代码。 - 如果在 `try` 块中发生了异常且没有被捕获,则程序会跳转到 `finally` 块执行。 - 即使 `try` 块中的代码正常执行完毕,`finally` 块也会被执行。 - `finally` 块通常用于释放资源、关闭文件或数据库连接等操作[^4]。 #### 4. 示例代码 以下是一个使用 `try-finally` 的示例,展示了如何确保资源被正确释放: ```csharp public void ReadFile(string filePath) { System.IO.StreamReader file = null; try { file = new System.IO.StreamReader(filePath); Console.WriteLine(file.ReadToEnd()); } finally { if (file != null) { file.Close(); // 确保文件流被关闭 } } } ``` 在此示例中,无论文件读取是否成功,`finally` 块都会确保文件流被关闭[^4]。 #### 5. 异常与 `finally` 的关系 即使在 `try` 块中抛出了未捕获的异常,`finally` 块仍然会被执行。这保证了即使程序因异常而终止,关键的清理代码也能被执行[^1]。 #### 6. `try-catch-finally` 组合 当需要处理异常并同时执行清理操作时,可以结合 `catch` 和 `finally` 使用: ```csharp public int Divide(int a, int b) { try { return a / b; } catch (DivideByZeroException e) { Console.WriteLine("Error: Division by zero."); throw; // 重新抛出异常 } finally { Console.WriteLine("Finally block executed."); } } ``` 在这个例子中,`finally` 块会在任何情况下(包括异常)执行[^2]。 #### 7. 注意事项 - `finally` 块中的代码不应包含可能引发新异常的逻辑,以免干扰异常处理流程。 - 如果 `try` 块中存在 `return` 语句,`finally` 块仍会在方法返回前执行[^3]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值