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

 更新时间:2015年09月28日 18:09:36   投稿:goldensun  
这篇文章主要介绍了Java异常处理中finally子句的运用,是Java入门学习中的基础知识,需要的朋友可以参考下

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

相关文章

  • velocity显示List与Map的方法详细解析

    velocity显示List与Map的方法详细解析

    以下是对velocity显示List与Map的方法进行了详细的介绍。需要的朋友可以过来参考下
    2013-08-08
  • 深入浅析SpringBoot自动配置原理

    深入浅析SpringBoot自动配置原理

    本文给大家介绍SpringBoot自动配置原理解析,springboot使用的是2.3.1版本源码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-10-10
  • Spring中@Validated和@Valid区别浅析

    Spring中@Validated和@Valid区别浅析

    @Valid是javax.validation里的, @Validated是@Valid 的一次封装,是Spring提供的校验机制使用,下面这篇文章主要给大家介绍了关于Spring中@Validated和@Valid区别的相关资料,需要的朋友可以参考下
    2022-04-04
  • idea中使用(Revert Commit)图解

    idea中使用(Revert Commit)图解

    这篇文章主要介绍了idea中使用(Revert Commit)图解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Java获取IP地址以及MAC地址的示例代码

    Java获取IP地址以及MAC地址的示例代码

    IP地址是用于在网络上识别设备的唯一地址,而MAC地址是设备的物理地址,本文主要介绍了Java获取IP地址以及MAC地址的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • java GUI实现ATM机系统(3.0版)

    java GUI实现ATM机系统(3.0版)

    这篇文章主要为大家详细介绍了java GUI实现ATM机系统(3.0版),文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • 详解Java编程中向量(Vector)的应用

    详解Java编程中向量(Vector)的应用

    这篇文章主要介绍了Java中的向量(Vector)的应用,Vector也是Java中比较常用的一个类,需要的朋友可以参考下
    2015-10-10
  • Java中对AtomicInteger和int值在多线程下递增操作的测试

    Java中对AtomicInteger和int值在多线程下递增操作的测试

    这篇文章主要介绍了Java中对AtomicInteger和int值在多线程下递增操作的测试,本文得出AtomicInteger操作 与 int操作的效率大致相差在50-80倍上下的结论,需要的朋友可以参考下
    2014-09-09
  • MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决

    MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决

    这篇文章主要介绍了MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • SpringBoot+Dubbo+Zookeeper实现简单分布式开发的应用详解

    SpringBoot+Dubbo+Zookeeper实现简单分布式开发的应用详解

    这篇文章主要介绍了SpringBoot+Dubbo+Zookeeper实现简单分布式开发的应用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论