这几个问题可以更加了解try-catch-finally。
1.
public class TestTryCatchFinally {
public static void main(String[] args) {
System.out.println(getA());
}
public static int getA() {
int a = 1;
try {
System.out.println(a / 0);
a = 2;
} catch (ArithmeticException e) {
a = 3;
return a;
/*
* return a 在程序执行到这一步的时候
* 这里不是return a 而是 return 3;这个返回路径就形成了
* 但是,它发现后面还有finally
* 所以继续执行finally的内容
* a=4 再次回到以前的路径,继续走return 3,
* 形成返回路径之后,这里的a就不是a变量了,而是常量3
*/
} finally {
a = 4;
}
// 这里return a;也不会影响返回结果,因为在catch中已经返回
return 0;
}
}
运行结果:3
2.
public class TestTryCatchFinally {
public static void main(String[] args) {
System.out.println(getA());
}
@SuppressWarnings("finally")
public static int getA() {
int a = 1;
try {
System.out.println(a / 0);
a = 2;
} catch (ArithmeticException e) {
a = 3;
return a;
} finally {
a = 4;
// 如果这样,就又重新形成了一条返回路径
// 由于只能通过1个return返回,所以这里直接返回4
return a;
}
}
}
运行结果:4
3.
public class TestTryCatchFinally {
public static void main(String[] args) {
System.out.println(getA());
}
public static int getA() {
int a = 1;
try {
System.out.println(a / 0);
a = 2;
} catch (ArithmeticException e) {
a = 3;
} finally {
a = 4;
}
return a;// 这样只有一个回路,按照赋值先后顺序,最后的赋值为答案
}
}
运行结果:4
4
public class TestTryCatchFinally {
public static void main(String[] args) {
System.out.println(getA());
}
public static int getA() {
int a = 1;
try {
System.out.println(a / 0);
a = 2;
System.out.println("a=2");
} catch (ArithmeticException e) {
a = 3;
System.out.println("a=3");
// 系统程序退出后不会进行finally流程。
System.exit(0);
} finally {
a = 4;
System.out.println("a=4");
}
System.out.println("a=" + a);
return a;
}
}
5.
class A {
public static void main(String[] args) {
method();
}
static void method() {
try {
System.out.println("Hello");
} finally {
System.out.println("World");
}
}
}
编译运行后,输出结果是()。(选择一项)
a) Hello
b) World
c) Hello
World
d) 代码不能编译
答案:c
解析:好多人认为try-catch语句是放在一起不能省略的。其实try语句后面是可以省略catch语句的,但是必须有finally语句。也可以省略finally语句,但是必须要有catch语句。也就是说try语句后面必须要有一个别的语句跟在后面。有如下三种:
try-catch
try-finally
try-catch-finally
切记:catch和finally语句不能同时省略!!!
小结:
a、不管有没有出现异常,finally块中代码都会执行;
b、当try和catch中有return时,finally仍然会执行;
c、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
d、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
e、try-catch-finally流程在执行finally分支前如果系统进程退出(System.exit)或被kill掉,finally分支将不会被执行。
f、try-catch-finally catch和finally语句不能同时省略!!!