详解Java异常处理中finally子句的运用

作者:goldensun 时间:2023-11-29 10:10:30 

当异常被抛出,通常方法的执行将作一个陡峭的非线性的转向。依赖于方法是怎样编码的,异常甚至可以导致方法过早返回。这在一些方法中是一个问题。例如,如果一个方法打开一个文件项并关闭,然后退出,你不希望关闭文件的代码被异常处理机制旁路。finally关键字为处理这种意外而设计。

finally创建一个代码块。该代码块在一个try/catch 块完成之后另一个try/catch出现之前执行。finally块无论有没有异常抛出都会执行。如果异常被抛出,finally甚至是在没有与该异常相匹配的catch子句情况下也将执行。一个方法将从一个try/catch块返回到调用程序的任何时候,经过一个未捕获的异常或者是一个明确的返回语句,finally子句在方法返回之前仍将执行。这在关闭文件句柄和释放任何在方法开始时被分配的其他资源是很有用的。finally子句是可选项,可以有也可以无。然而每一个try语句至少需要一个catch或finally子句。

下面的例子显示了3种不同的退出方法。每一个都执行了finally子句:


// Demonstrate finally.
class FinallyDemo {
 // Through an exception out of the method.
 static void procA() {
   try {
     System.out.println("inside procA");
     throw new RuntimeException("demo");
   } finally {
     System.out.println("procA's finally");
   }
 }
// Return from within a try block.
 static void procB() {
   try {
     System.out.println("inside procB");
     return;
   } finally {
     System.out.println("procB's finally");
   }
 }
 // Execute a try block normally.
 static void procC() {
   try {
     System.out.println("inside procC");
   } finally {
     System.out.println("procC's finally");
   }
 }
public static void main(String args[]) {
   try {
    procA();
   } catch (Exception e) {
    System.out.println("Exception caught");
   }
   procB();
   procC();
 }
}

该例中,procA( )过早地通过抛出一个异常中断了try。Finally子句在退出时执行。procB( )的try语句通过一个return语句退出。在procB( )返回之前finally子句执行。在procC()中,try语句正常执行,没有错误。然而,finally块仍将执行。

注意:如果finally块与一个try联合使用,finally块将在try结束之前执行。

下面是上述程序产生的输出:


inside procA
procA's finally
Exception caught
inside procB
procB's finally
inside procC
procC's finally


标签:Java,finally
0
投稿

猜你喜欢

  • C#基于时间轮调度实现延迟任务详解

    2023-07-06 08:00:49
  • Android仿美团淘宝实现多级下拉列表菜单功能

    2022-07-24 18:42:18
  • Android开发之使用150行代码实现滑动返回效果

    2023-03-20 11:08:50
  • 利用Java如何获取Mybatis动态生成的sql接口实现

    2021-05-25 13:05:27
  • Java实现简单文件过滤器功能

    2021-09-13 23:27:58
  • 分析SpringBoot的启动原理

    2021-10-30 16:01:23
  • springboot项目部署在linux上运行的两种方式小结

    2022-09-17 11:07:37
  • 深入解析Android系统中应用程序前后台切换的实现要点

    2022-09-11 01:26:30
  • Java使用5个线程计算数组之和

    2022-07-25 21:41:37
  • Java8 如何移除两个相同的List对象

    2023-06-07 20:57:50
  • Java 高并发的三种实现案例详解

    2023-12-16 10:57:30
  • Java枚举类使用Lombok方式

    2022-06-28 22:07:02
  • Java中Maven项目导出jar包配置的示例代码

    2023-01-26 20:09:32
  • Java使用TCP套接字实现多人聊天功能详解

    2023-12-16 15:42:40
  • Java(TM) Platform SE binary 打开jar文件的操作

    2021-10-02 00:08:12
  • Spring4整合Hibernate5详细步骤

    2022-03-15 16:53:07
  • Spring异常捕获且回滚事务解决方案

    2023-04-25 18:32:41
  • 阿里nacos+springboot+dubbo2.7.3统一处理异常的两种方式

    2022-12-05 03:50:25
  • C#实现日期格式转换的公共方法类实例

    2023-05-16 10:06:54
  • Spring配置中transactionAttributes的使用方法介绍

    2021-06-16 10:59:05
  • asp之家 软件编程 m.aspxhome.com