疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

java中的finlly里的return和throw


 

   

  对于很多新手而言,这个问题可能没有思考过,就是在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");

  }

  }

  }

  1. 运行的结果是bbb即抛出的是finally里的异常

  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,所以抛出的异常和是否为运行时异常没关系

  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";

  }

  }

  }

  3.运行的结果是okfinally,即对于返回的是引用还是只运行了finally里的return

  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

  可以看出,当try里面和finlly里面同时有return或者是抛出异常的情况,则只执行finally里面的return或者抛出异常,但是问题远没有这么简单

  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

  剩下几个数据类型就不测了,然后就有了一个新问题,对于int类型的时候先执行try里的return 还是先执行finally里的return?于是测试代码如下

  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 并将结果返回

  然后出现这样的原因。。笔者水平有限,无法做出解答