学习Java的时候遇到了许多关于try-catch-finally块执行规则的问题,在这里简单整理一下,可能还会继续补充。
问题1:
public class Test {
public static void main(String[] args) {
System.out.println("return value of getValue(): " + getValue());
}
public static int getValue() {
int i = 1;
try {
i = 4;
} finally{
i++;
return i;
}
}
}
i首先被赋值为1,然后try里面的语句没有异常直接执行,i赋值为4,然后执行finally中的语句,最后返回结果为5。
问题2:
package Test;
public class Test {
private static void test(int[] arr) {
for (int i = 0; i < arr.length; i++) {
try {
if (arr[i] % 2 == 0) {
throw new NullPointerException();
} else {
System.out.print(i);
}
} finally {
System.out.print("e");
}
}
}
public static void main(String[]args) {
try {
test(new int[] {0, 1, 2, 3, 4, 5});
} catch (Exception e) {
System.out.print("E");
}
}
}
因为arr[0] =0,所以test方法的try语句块里面会抛出一个异常NullPointerException,接着会执行finally中的语句,输出一个e,然后回到 main方法中,try语句块中捕捉到异常,所以执行catch语句块中的语句,输出一个E,最终运行结果为eE。
问题3:
public class ZeroTest {
public static void main(String[] args) {
try{
int i = 100 / 0;
System.out.print(i);
}catch(Exception e){
System.out.print(1);
throw new RuntimeException();
}finally{
System.out.print(2);
}
System.out.print(3);
}
}
执行try中的第一条语句int i = 100 / 0会抛出一个异常,然后执行catch中的语句,输出一个1,之后又抛出了一个新的异常RuntimeException。这个程序中没有对这个异常的处理,因此继续执行finally中的语句输出一个2以后程序便终止,不会在执行最后一条语句输出3,因此运行结果为12。
而如果在catch中不抛出这个异常,程序正常运行,输出123。
问题4:
package algorithms.com.guan.javajicu;
public class TestDemo
{
public static String output = ””;
public static void foo(int i)
{
try
{
if (i == 1)
{
throw new Exception();
}
}
catch (Exception e)
{
output += “2”;
return ;
} finally
{
output += “3”;
}
output += “4”;
}
public static void main(String[] args)
{
foo(0);
foo(1);
System.out.println(output);
}
}
i=0时,不满足try语句块中的if语句,直接执行finally语句块,输出3,然后正常运行foo方法的最后一条语句,输出变为34。i=1时,try语句块中抛出一个异常,然后执行catch语句块,输出变为342,然后因为finally语句块的执行是在方法返回之前的,所以接着会执行finally语句块的内容,输出变为3423,然后再return。因此最终运行结果为3423。