先假设try catch finally整块叫A块
1、try块:A块程序的入口,有异常执行第2步,否则第3步
2、catch块:主要用于捕获try块中抛出的异常,并进行处理
3、finally块:A块的必须执行体,有些资料说finally是A块的最终执行体,这并不准确,假如try块中有个return,那finally执行完之后会返回到try块中
A块程序有个结束体,finally块就是在结束体之前强行调用运行。
??下面的方法会返回什么值
1private static String getStr(){
2 String str = "abc";
3 try{
4 return str;
5 }finally{
6 str += "def";
7 }
8}
程序运行到第4行,这就是A块结束体,此时跳到finally中执行,这时的str=“abcdef”,
但是执行第4行的时候,return str已经将str=“abc”压入函数栈中,所以此方法返回的还是“abc”
A块有一种可能的情况下不执行finally
关于A块的递归调用会产生这种现象 如:
private static void test() {
try {
System.out.println("a--");
test();
} catch (Throwable e) {
System.out.println("b--");
test();
} finally {
System.out.println("c--");
test();
}
}
这里A块的执行取决于机器了,假如内存足够大,程序会不断递归执行try块中的语句,一段时间不会执行finally,
内存不够时抛出异常,就会执行catch,遇到结束体又会执行finally,也许你在程序中随便加一段能编译通过的代码,运行又是另一种情况,这里就比较复杂了
1、try块:A块程序的入口,有异常执行第2步,否则第3步
2、catch块:主要用于捕获try块中抛出的异常,并进行处理
3、finally块:A块的必须执行体,有些资料说finally是A块的最终执行体,这并不准确,假如try块中有个return,那finally执行完之后会返回到try块中
A块程序有个结束体,finally块就是在结束体之前强行调用运行。
??下面的方法会返回什么值
1private static String getStr(){
2 String str = "abc";
3 try{
4 return str;
5 }finally{
6 str += "def";
7 }
8}
程序运行到第4行,这就是A块结束体,此时跳到finally中执行,这时的str=“abcdef”,
但是执行第4行的时候,return str已经将str=“abc”压入函数栈中,所以此方法返回的还是“abc”
A块有一种可能的情况下不执行finally
关于A块的递归调用会产生这种现象 如:
private static void test() {
try {
System.out.println("a--");
test();
} catch (Throwable e) {
System.out.println("b--");
test();
} finally {
System.out.println("c--");
test();
}
}
这里A块的执行取决于机器了,假如内存足够大,程序会不断递归执行try块中的语句,一段时间不会执行finally,
内存不够时抛出异常,就会执行catch,遇到结束体又会执行finally,也许你在程序中随便加一段能编译通过的代码,运行又是另一种情况,这里就比较复杂了