博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java知多少(51)finally
阅读量:6075 次
发布时间:2019-06-20

本文共 1856 字,大约阅读时间需要 6 分钟。

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

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

1 // Demonstrate finally. 2 class FinallyDemo { 3     // Through an exception out of the method. 4     static void procA() { 5         try { 6            System.out.println("inside procA"); 7            throw new RuntimeException("demo"); 8         } finally { 9            System.out.println("procA's finally");10         }11     }12 13     // Return from within a try block.14     static void procB() {15         try {16            System.out.println("inside procB");17            return;18         } finally {19            System.out.println("procB's finally");20         }21     }22     // Execute a try block normally.23     static void procC() {24         try {25            System.out.println("inside procC");26         } finally {27            System.out.println("procC's finally");28         }29     }30 31     public static void main(String args[]) {32        try {33           procA();34        } catch (Exception e) {35           System.out.println("Exception caught");36        }37        procB();38        procC();39     }40 }

该例中,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

系列文章:

转载于:https://www.cnblogs.com/Coda/p/4474865.html

你可能感兴趣的文章
Sharding-Sphere成长记——写在分布式数据库代理端里程碑版本3.0.0发布之际
查看>>
仅售99美元!英伟达发布最小AI计算机Jetson Nano
查看>>
Netflix混沌工程手册Part 2:混沌工程原则
查看>>
C# 7.3新特性一览
查看>>
C# 8新提案让泛型Attribute成为现实
查看>>
微软宣布开源WPF、WinForms和WinUI
查看>>
与Susan Fowler探讨生产就绪微服务之问答
查看>>
网络协议必会知识点:互联网网络分层
查看>>
WordPress.com使用JavaScript替换掉PHP
查看>>
微软发布Azure Pipelines,开源项目可无限制使用CI/CD
查看>>
如何成为一家敏捷银行
查看>>
Racket 6.7最新版本:提供对Android App的支持及改进的REPL等等
查看>>
从ABC+IOT到ABC anywhere,百度边缘计算的进击之路
查看>>
解读 2018之Go语言篇(上):为什么Go语言越来越热?
查看>>
openresty 前端开发入门六之调试篇
查看>>
Bleve:来自Couchbase、基于Go语言的全文索引与检索库
查看>>
QCon北京2015:自动化运维专题前瞻
查看>>
一个小米SRE的日常问题排查记录
查看>>
OpsRamp推出以服务为中心的AIOps和云监控功能
查看>>
每秒解析千兆字节的JSON解析器开源,秒杀一大波解析器!
查看>>