刚刚看到try catch finally语句,多思考了一下,发现他们的执行顺序心里还有点模糊,
所以特地测试了一下,以下是测试结果总结:
1. 当catch中没有return返回语句是,try catch finally是按从上到下的顺序依次执行!
代码:
public static void main(String[] args) {
int[] arr = { 1, 2, 3 };
System.out.println(arr[2]);
try {
System.out.println(2 / 0);
} catch (ArithmeticException ae) {
System.out.println("系统正在维护,请与管理员联系!");
} finally {
System.out.println("catch成功!");
}
}
执行结果---->:
3
系统正在维护,请与管理员联系!
catch成功!
2. 当catch中有return语句时,执行结果是先执行catch中的内容,当执行到return的时候,先去执行finally中的内容,最后执行return语句。
代码:
public static void main(String[] args) {
System.out.println(Test.test());
}
public static String test() {
int[] arr = { 1, 2, 3 };
System.out.println(arr[2]);
try {
System.out.println(2 / 0);
} catch (ArithmeticException ae) {
System.out.println("系统正在维护,请与管理员联系!");
return "myTest";
} finally {
System.out.println("catch成功!");
}
return null;
}
执行结果---->:
3
系统正在维护,请与管理员联系!
catch成功!
myTest
3. 当catch和finally中都有return字句时,finally中的return字句会覆盖catch中的return返回值.
代码:
public static void main(String[] args) {
System.out.println(Test.test());
}
public static String test() {
int[] arr = { 1, 2, 3 };
System.out.println(arr[2]);
try {
System.out.println(2 / 0);
} catch (ArithmeticException ae) {
System.out.println("系统正在维护,请与管理员联系!");
return "myTest";
} finally {
System.out.println("catch成功!");
return "myfinally";
}
}
执行结果---->:
3
系统正在维护,请与管理员联系!
catch成功!
myfinally
4. 当catch中有return字句,而finally中没有return字句,不过finally中有改变catch中return的返回值时(注意:当返回值类型为基本类型,Date类型时,在finally中修改返回值的值时,不影响catch中return的返回值结果):
代码:
public static void main(String[] args) {
System.out.println(Test.test());
}
public static String test() {
int[] arr = { 1, 2, 3 };
String a = "2";
System.out.println(arr[2]);
try {
System.out.println(2 / 0);
} catch (ArithmeticException ae) {
System.out.println("系统正在维护,请与管理员联系!");
return a;
} finally {
System.out.println("catch成功!");
a = "ccccc";
}
return "";
}
执行结果---->:
3
系统正在维护,请与管理员联系!
catch成功!
2
5. 即上面第4点的特殊点:
当catch中有return字句,而finally中没有return字句,不过finally中有改变catch中return的返回值时(注意:当返回值类型为list,map,数组时,在finally中修改返回值的值时,会影响catch中return的返回值结果):
代码:
public static void main(String[] args) {
int[] arr = { 1, 2, 3 };
System.out.println(Test.test(arr)[2]);
}
public static int[] test(int[] arr) {
System.out.println(arr[2]);
try {
System.out.println(2 / 0);
} catch (ArithmeticException ae) {
System.out.println("系统正在维护,请与管理员联系!");
return arr;
} finally {
System.out.println("catch成功!");
arr[2] = 5;
}
return null;
}
执行结果---->:
3
系统正在维护,请与管理员联系!
catch成功!
5
其中list,map我在这里就没贴代码了,已经通过了测试,各位有兴趣可以自己动手试试!
以上,仅供参考!!