关于java中的finlly里的return和throw的一些小细节
2014-10-29 00:02
363 查看
对于很多新手而言,这个问题可能没有思考过,就是在try代码块里的return,和finally里的return,到底谁执行了,还有抛出异常的情况
public class Test { static String str = "ok"; public static void main(String[] args) { say(); } public static void say()throws RuntimeException{ try{ throw new RuntimeException("aaa"); } finally{ throw new RuntimeException("bbb"); } } }
<strong>1. 运行的结果是bbb即抛出的是<span style="color:#ff0000;">finally里的异常</span></strong>
<pre name="code" class="java">public class Test2 { public static void main(String[] args) throws Exception { say(); } public static void say()throws Exception{ try{ throw new Exception("aaa"); } finally{ throw new Exception("bbb"); } } }2.运行的结果还是bbb,所以抛出的异常和是否为运行时异常没关系
<pre name="code" class="java">public class Test7 { static String str = "ok"; public static void main(String[] args) throws Exception { String strs = say(); System.out.println(strs); } public static String say(){ try{ return str+"try"; } finally{ return str+"finally"; } } }
<strong> 3.运行的结果是okfinally,即<span style="color:#ff0000;">对于返回的是引用还是只运行了finally里的return</span></strong>
<pre name="code" class="java">public class Test8 { static boolean flag = false; public static void main(String[] args) throws Exception { boolean flags = say(); System.out.println(flags); System.out.println(flag); } public static boolean say(){ try{ return flag=true; } finally{ return flag=false; } } }4.运行的结果是false false,所以也就是还是只执行了finally的return
<span style="color:#ff0000;">可以看出,当try里面和finlly里面同时有return或者是抛出异常的情况,则只执行finally里面的return或者抛出异常,<strong>但是问题远没有这么简单</strong></span>
<pre name="code" class="java"><pre name="code" class="java">public class Test6 { static int a = 0; public static void main(String[] args) throws Exception { int s = say(); System.out.println(s); System.out.println(a); } public static int say()throws Exception{ try{ return ++a; } finally{ return 13; } } }5.此代码的运行结果是s为13,但是a为1而不是0,即++a被执行了对于前面我们试了引用,布尔,结果都是只执行finally里的return,并且忽略掉try里的return语句,但是在int类型的时候,try里的return语句执行了操作(但是没有返回而是执行了finally的return语句)。然后,我依次测试了double和char,结果就是double和int一样都是在执行了try里面的return 里的语句,char则没有执行try里的return
<span style="color:#33cc00;">剩下几个数据类型就不测了,然后就有了一个新问题,对于int类型的时候先执行try里的return 还是先执行finally里的return?</span>于是测试代码如下
<pre name="code" class="java">public class Test12 { static int a = 2; public static void main(String[] args) throws Exception { int s = say(); System.out.println(s); System.out.println(a); } public static int say()throws Exception{ try{ return a=a*a; } finally{ return a=a*3; } } }结果发现a为12,即执行的先后顺序应该是先执行了try里的return,但是不返回结果,继续执行finally里的return 并将结果返回
然后出现这样的原因。。笔者水平有限,无法做出解答
相关文章推荐
- 关于JAVAWEB一些细节问题
- 关于Java中try catch finally throw return的执行顺序问题
- Java 7 switch支持String类型的原理和关于switch一些细节
- 关于java初始化块的一些细节问题
- 【细说Java】关于main方法的一些细节
- 关于java中编码的一些小细节
- 关于return和finally的一些细节。
- 关于java的一些细节问题,笔试可能会问到,整理一下
- 关于Java的一些基础细节(整理)
- java关于网络编程的一些细节的复习
- 关于C++的一些细节[三:复合类型]
- Java中一些关于日期、日期格式、日期的解析和日期的计算
- 关于初学JAVA里的一些问题!
- 关于星际中一些细节部分的观点
- Java中一些关于日期、日期格式、日期的解析和日期的计算
- 关于java中文乱码问题一些解决方案和经验
- 关于java异常中的throws和throw的区别
- 一些 Java 语言的基础细节
- 关于JavaCC的一些链接
- 原创:关于一些Java开发工具的使用心得(不断更新)