问题
package com.bat.example; public class Main { public static void main(String[] args) { System.out.println(test_finally1()); System.out.println(test_finally2()); System.out.println(test_finally3()); System.out.println(test_finally4()); } private static int test_finally1() { int i = 1; try { return i; } catch (Exception e) { e.printStackTrace(); } finally { i = 0; } return i; } private static int test_finally2() { int i = 1; try { return i; } catch (Exception e) { e.printStackTrace(); } finally { i = 0; return i; } } private static Teacher test_finally3() { Teacher teacher = new Teacher("david"); try { return teacher; } catch (Exception e) { e.printStackTrace(); } finally { teacher = new Teacher("lucy"); } return null; } private static Teacher test_finally4() { Teacher teacher = new Teacher("david"); try { return teacher; } catch (Exception e) { e.printStackTrace(); } finally { teacher.setName("lucy"); } return null; } }
public class Teacher { private String name; public Teacher(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return name; } }
输出结果:
1
0
david
lucy
总结
- 无论try的结果如何,都会执行finally操作
- 在try中return,在finally执行前会把结果保存起来,即使在finally中有修改也以try中保存的值为准,但如果是引用类型,修改的属性会以finally修改后的为准
- 如果try/finally都有return,直接返回finally中的return