对于很多新手而言,这个问题可能没有思考过,就是在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 并将结果返回
然后出现这样的原因。。笔者水平有限,无法做出解答