发新话题

全面测试Java里finally代码对返回值的影响

import java.util.ArrayList;
import java.util.List;

/**
 *  全面测试Java里finally代码对返回值的影响<br>
 * 
 * @author JAVA世纪网(java2000.net, laozizhu.com)
 */
public class Test {
  public static void main(String[] args) {
    System.out.println(a()); // 测试finally单纯修改返回值1
    System.out.println(b()); // 测试finally修改返回值并返回11
    System.out.println(c()); // 测试finally修改对象类型[java2000.net]
    System.out.println(d()); // 测试finally修改对象类型并返回null
  }

  public static int a() {
    System.out.print("测试finally单纯修改返回值");
    int i = 1;
    try {
      return i;
    } finally {
      i = i + 10;
    }
  }

  public static int b() {
    System.out.print("测试finally修改返回值并返回");
    int i = 1;
    try {
      return i;
    } finally {
      i = i + 10;
      return i;
    }
  }

  public static List c() {
    System.out.print("测试finally修改对象类型");
    List li = new ArrayList();
    try {
      return li;
    } finally {
      li.add("java2000.net");
      li = null; // 注意,此处的li并不影响返回的li,他们是2个不同的引用
    }
  }

  public static List d() {
    System.out.print("测试finally修改对象类型并返回");
    List li = new ArrayList();
    try {
      return li;
    } finally {
      li.add("java2000.net");
      li = null;
      return li;
    }
  }
}
快乐渡过每一天,减肥坚持每一天
编辑 回复 快速回复 TOP
你是个好人,所以运行结果应该是1,11,java2000.net,null, return之前会先执行finally里的代码,对于非对象类型,finally里的代码不能通过重新给变量赋值来改变return语句的返回值,对于对象类型,和其不同,一个为复制,一个为引用,所以前两个的输出结果为1和11,后两个结果java2000.net和null
另外,程序中没有finally里使用return语句的。这样会覆盖屏蔽掉try或catch中的return,要么就是捕获不到异常。
编辑 回复 快速回复 TOP
我写了半天,结果提示我登录。后退就没得了。
编辑 回复 快速回复 TOP
老紫竹,有bug,这个bug我遇到几次了。
编辑 回复 快速回复 TOP
发新话题