执行顺序:
如下代码:
简单定义一个类:
package top.ailvcheng.t0406_return;
import cn.hutool.core.lang.Assert;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
* @ClassName Main
* @Description return 和 finally,及 finally中有return
* @Version 1.0
**/
class Main {
/**
* return 和 finally
*
* @return
*/
private static TestClass test(Integer num) {
final TestClass.TestClassBuilder builder = TestClass.builder()
.name("test");
try {
Assert.notNull(num, "num is null");
System.out.println("1执行了");
return builder.num(num).build();
} catch (Exception e) {
e.printStackTrace();
} finally {
builder.num(333);
System.out.println("2执行了 ");
System.out.println(builder.build());
}
return builder.build();
}
private static TestClass test2(Integer num) {
final TestClass.TestClassBuilder builder = TestClass.builder()
.name("test");
try {
Assert.notNull(num, "num is null");
builder.num(num);
System.out.println("1执行了");
return builder.build();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("2执行了");
// finally中有return语句
return builder.num(-1).build();
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
private static class TestClass {
private String name;
private Integer num;
}
public static void main(String[] args) {
System.out.printf("test num :%s\n", test(1));
System.out.println("---------\n");
// finally中有return ,返回结果受影响
System.out.printf("test num :%s\n", test2(99));
// 断言null
System.out.printf("test num :%s\n", test(null));
System.out.printf("test num :%s\n", test2(null));
}
}
运行结果如下:
由此可见,
- 参数为null或正常,即无论何时,只要异常处理中使用finally,其代码块都会执行(除了程序或者线程提前退出)
- 若在某个具有返回值方法中进行异常处理且使用了finally,其执行位置处于 try-catch代码块退出前,即先return后finally,且在方法执行完取到值前 (且在其中操作了该对象的值,若finally中不含有return语句,不会影响返回值)
- 若finally中具有return语句,且修改了某个对象,或直接返回时操作了某个对象,会影响返回值