兜底

在工作中,我们希望遇到这样的领导,他会对你说:没事,大胆干,有什么问题找我,上边压力我帮你们顶着。当然他也是这么做。

在感情中,我们希望遇到这样的伴侣,他会对你说:没事,不想干就别干了,回家我养你,又不是养不起。当然他也是这么做。

在社交中,我们希望遇到这样的朋友,他会对你说:别慌,工作迟早能找见,找不见先来我这,管吃管住还是没问题的。当然他也是这么做。

每个人都希望在无能为力的时候,有人站出来说,别怕,还有我。

但现实大多不如意,大概率你遇到的都是以下这样的:

领导,你们注意啊,干活儿认真点,别给我惹麻烦,有事儿自己解决,别扯我身上,有好处记得我。

伴侣,咋就不想干了,不干这个干什么,你不干活吃什么,喝什么,我可养不起你。

朋友,什么?信号不好,有时间再说哈。

可能是跟程序打交道多了,不想去跟人争辩,程序会按照既定规则来执行,而且程序还有帮我们兜底的责任心。

今天我们就讲一个可靠的关键字,finally

一、try-catch-finally

一般写法,当然,我们只是举例说明我们使用finally的场景,而不是说必须加finally

// 步骤1.do something
try {// 步骤2.do something
} catch (ExceptionA a) {// 步骤3.do something
} catch (ExceptionB b) {// 步骤4.do something
} finally {// 步骤5.do something
}

大家都很熟悉这样的写法,经常会有人出一些闹经急转弯的题,这里我也简单来解答一下。

1. 什么时候finally不执行

在步骤1中有异常抛出,有return的时候,都不执行finally

其实这是一句废话,根本没有进try-catch-finally体系,他怎么可能执行嘛,但是就有人考你,记住这个坑就好

在步骤1、2、3、4中如果有系统级别错误,或者系统级别退出后就不执行finally,很容易理解,

系统崩溃了,当然任何步骤都不会执行了。比如断电,cpu烧了等。

在系统没问题的时候,系统很听话的,你说你退出吧(system.exit(0)),他马上退出,一条语句都不愿意多给你执行的。

public static void main(String[] args) {try {System.out.println("try");throw new RuntimeException("异常");} catch (Exception e) {System.out.println("catch");System.exit(0);} finally {System.out.println("finaly");}
}

输出结果可以看到finally没有执行:

2. 执行哪个return(或者是程序执行顺序)

这个虽然简单,但是很多类型。

咱们就不聊try前边的代码了,咱们只聊try-catch-finaly的代码

情况1:

执行顺序:try->catch->finally->other->returnOther

当然,try没有异常是不执行catch的,这个点下边几种情况就不赘述了。

try {System.out.println("try");throw new RuntimeException("错误");
} catch (Exception e) {System.out.println("catch");
} finally {System.out.println("finally");
}
System.out.println("other");
return "returnOther";

情况2:

执行顺序:try->finally->returnTry

try里有return且没有在return前抛异常,那么就不会执行returnOther

说明:

在这里说明一下,我这里写了finally->returnTry .

但是我们finally的代码块是在return语句执行之后,返回之前执行的。我这里的returnTry意思是返回,而非执行return。

流程是这样的:return代码执行存储返回值X->finally代码块执行->返回存储的值X 下边情况也类似,自己体会。

如果我们看编译后的字节码,我们会发现,return后store,然后执行一系列操作(finally代码),然后再执行load

下边的catch返回也类似。

try {System.out.println("try");return "returnTry";
} catch (Exception e) {System.out.println("catch");
} finally {System.out.println("finally");
}
System.out.println("other");
return "returnOther";

如果有异常,是这样子的:

try->catch->finally->other->returnOther

try {System.out.println("try");int j = 10/0;return "returnTry";
} catch (Exception e) {System.out.println("catch");
} finally {System.out.println("finally");
}
System.out.println("other");
return "returnOther";

情况3:

执行顺序:try->catch->finally->returnCatch

try {System.out.println("try");int j = 10/0;
} catch (Exception e) {System.out.println("catch");return "returnCatch";
} finally {System.out.println("finally");
}
System.out.println("other");
return "returnOther";

情况4:

执行顺序:try->finally->returnFinally

try {System.out.println("try");return "returnTry";
} catch (Exception e) {System.out.println("catch");
}finally {System.out.println("finally");return "returnFinally";
}

情况5:

执行顺序:try->catch->finally->returnFinally

try {System.out.println("try");throw new RuntimeException("异常");
} catch (Exception e) {System.out.println("catch");return "returnCatch";
}finally {System.out.println("finally");return "returnFinally";
}

情况6:

执行顺序:try->catch->finally->returnFinally

try {System.out.println("try");int j = 1/0;return "returnTry";
} catch (Exception e) {System.out.println("catch");return "returnCatch";
}finally {System.out.println("finally");return "returnFinally";
}

注意:

如果finally有return就会直接return的意思不是说不执行try或者catch里边的return,我们情况2说了,return分为两步,如果finally里边有return,那么try,catch里的return只会执行第一步,例如:

执行顺序:try->try里return代码->finally->returnFinally

package test;/*** @author 木子的昼夜编程*/
public class TryCatchFinayTest {public static void main(String[] args) {System.out.println(test04());}public static String test04() {try {System.out.println("try");return get();} catch (Exception e) {System.out.println("catch");return "returnCatch";}finally {System.out.println("finally");return "returnFinally";}}private static String get() {System.out.println("try里return代码");return "嘿嘿";}}

3.返回什么值

有下边两个程序,大家看一下输出值是什么:

age=?
i=?

package test;/*** @author 木子的昼夜编程*/
public class TryCatchFinayTest {public static void main(String[] args) {System.out.println("age:"+test01().age);System.out.println("i:"+test02());}// 返回对象(实际是返回对象的引用)public static Person test01() {Person p = new Person();try {p.age = 18;return p;} catch (Exception e) {p.age = 19;}finally {p.age = 20;}return p;}// 返回基本类型public static int test02() {int i = 0;try {i = 18;return i;} catch (Exception e) {i = 19;}finally {i = 20;}return i;}}class Person{int age;
}

没错:

age=20

i=18

i=18这个应该没啥疑问,如果对age=20有疑问的,你要理解,test01()返回的是对象的引用

如果我们看编译后的字节码,你会发现是用的areturn (从当前方法返回对象的引用),而test01()是用的ireturn(从当前方法返回int),不管在哪儿,只要修改了引用对象的值,其他地方都是有感知的。

当然了,例如String、基础类型包装类(Integer等),返回也是areturn,但是我们finally修改了,返回是不生效的。

4. 唠唠

今天不唠了,下次吧。

try-cathc-finally相关推荐

  1. 复习心得 JAVA异常处理

    java中的异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字.其中, try关键字后紧跟一个花括号括起来的代码块(花括号不可省略)简称为try块.里面放置可 ...

  2. Java关键字及其作用

    一. 关键字总览: 访问控制 private protected public             类,方法和变量修饰符 abstract class extends final implemen ...

  3. java 入门 第三季1

    异常和异常体系 java异常体系 throwable:error:线程死锁,内存溢出 excepiton:rumtimeException运行时异常:非检查异常 检查异常:文件异常IOExceptio ...

  4. C++反汇编第五讲,认识C++中的Try catch语法,以及在反汇编中还原

    我们以前讲SEH异常处理的时候已经说过了,C++中的Try catch语法只不过是对SEH做了一个封装. 如果不懂SEH异常处理,请点击博客链接熟悉一下,当然如果不想知道,也可以直接往下看.因为异常处 ...

  5. [导入]PHP5的异常处理

    <?php /** * ■㈠PHP5的异常处理 * * PHP 5 添加了类似于其它语言的异常处理模块.在 PHP 代码中所产生的异常可被 throw * 语句抛出并被 catch 语句捕获.需 ...

  6. Spring事务属性详解

    spring,是一个Java开源框架,是为了解决企业应用程序开发复杂性由Rod Johnson创建的.框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序 ...

  7. 【Spring】详解spring事务属性

    Spring声明式事务让我们从复杂的事务处理中得到解脱.使得我们再也无需要去处理获得连接.关闭连接.事务提交和回滚等这些操作.再也无需要我们在与事务相关的方法中处理大量的try-catch-final ...

  8. 【Java学习笔记之一】java关键字及作用

    Java关键字及其作用 一. 总览: 1 访问控制 2 private protected public 3 4 类,方法和变量修饰符 5 abstract class extends final i ...

  9. Spring事务配置的五种方式 说明

    Spring事务配置的五种方式  [转 http://blog.csdn.net/hjm4702192/article/details/17277669] Spring配置文件中关于事务配置总是由三个 ...

  10. PHP5异常处理,PHP5异常处理分析实例

    PHP5异常处理分析实例 导语:PHP 5 添加了类似于其它语言的异常处理模块.下面的是百分网小编为大家搜集的用实例分析PHP5异常处理实例,希望对你能有所帮助. <?php /** * ■㈠P ...

最新文章

  1. PAT (Advanced Level) 1002. A+B for Polynomials (25)
  2. (*长期更新)软考网络工程师学习笔记——Section 11 Linux操作系统简介
  3. java xfire webservice 异步_[Java教程]Java中使用webservice,简化开发(xfire的webservice)...
  4. 阿里巴巴发布智能运维故障管理AI+生态计划
  5. 春招我借这份PDF的复习思路,论程序员成长的正确姿势
  6. 计算机一级13点,2013年计算机一级考试MsOffice备考题及答案(13)
  7. Java中使用OpenSSL生成的RSA公私钥进行数据加解密
  8. CCN(content centric networking)介绍
  9. Bootstrap 后台模板-AdminLTE
  10. .NET 实现异步处理的集中方式
  11. 泛型指针,原生指针和智能指针
  12. 高级字符驱动程序操作之休眠(理论篇)
  13. 项目管理中PMO项目管理办公室的价值
  14. Flash Builder实用快捷键集锦
  15. WIFI小车记录四:用Adobe Illustrator绘制应用磁贴
  16. 在学校计算机上填报志愿,广州小升初电脑派位如何填报志愿?
  17. deepin 下使用节能模式不降低屏幕亮度
  18. 设计模式(2)结构型模式
  19. 未来哪些职业最有可能被人工智能替代
  20. 小明加密通道进入_德州人行通道闸哪个牌子好

热门文章

  1. 基于STM32F030、MAX30102血氧心率监测仪的设计(四)
  2. 使用Python处理教育领域的数据——以一篇期刊论文为例
  3. localStorage的存储,读取,删除
  4. LTE射频拉远单元数字中频方案(九)
  5. 「P8t.ch」靠卖QR-Code实体商品,想变成下一个TinyURL
  6. Ansys workbench几何建模- DesignModeler (1)
  7. 三种方式实现生产者消费者模式
  8. 2.4-CSS基础--颜色常见取值
  9. word替换使用通配符_在Word 2016中搜索时如何使用通配符
  10. 【uni-app】常用图标、头像汇总