Fork me on GitHub

java中关于try、catch、finally的分析

java中关于try、catch、finally的分析

1.try、catch、finally语句中,在如果try语句有return语句,则返回的之后当前try中变量此时对应的值,此后对变量做的任何修改,都不影响try中return的返回值

2.如果finally块中有return语句,则返回try或catch中的返回语句忽略

3.如果finally块中抛出异常,则整个try、catch、finally块中抛出异常


在使用try、catch、finally语句块中需要注意的

1.尽量在try或者catch中使用return语句。通过finally块中达到对try或者catch返回值修改是不可行的。

2.finally块中避免使用return语句,因为finally块中如果使用return语句,会显示的消化掉try、catch块中的异常信息,屏蔽了错误的发生

3.finally块中避免再次抛出异常,否则整个包含try语句块的方法会抛出异常,并且会消化掉try、catch块中的异常


java异常

在java中异常的继承主要有两个:Error和Exception;

1.其中Error为jvm出现错误,以及系统奔溃等现象,这些错误没有办法通过程序来处理。多以在程序中不能使用catch来捕获这类异常。

2.对于Exception又可以分为checkedException和RuntimeException这两类异常,

2.1checkedException异常在进行编译运行之前就可以知道会不会发生异常,如果不对这类异常进行抛出、捕获的话就不能通过编译。

2.2RuntimeException就是在运行时候出现的异常,在运行之前无法确定


一般对异常的处理
把会出现异常的代码块放在try语句块中,当抛出异常的时候就会生成一个异常对象。然后进行查找捕获这个异常,然后再进行对这个异常的处理


为什么要使用finally
把资源释放或状态还原的代码放到finally块中,可以保证在try和catch语句块中执行完后,一定会执行finally语句块,而不用考虑各种复杂的跳转情况。

需要注意的是,当异常没有被catch,则直接抛出,也不会执行到try-catch下面的语句,因为这个异常被系统处理就是打印了异常栈的信息之后就结束了这个程序,也就是结束了这个进程


finally一般在什么时候执行
finally在return语句之后,跳转到上一级程序之前执行

public static void main(String[] args) {  
    System.out.println(test());  
}  

public static String test() {  
    try {  
        System.out.println("try block");  
        return test1();  
    } finally {  
        System.out.println("finally block");  
        // return "finally";  
    }  
}  

public static String test1() {  
    System.out.println("return statement");  
    return "after return";  
}  

执行结果:

try block
return statement
finally block
after return


分析:
1.try语句块,return test1(),则调用test1方法
2.test1()执行完后返回“after return”,返回值“after return”保存在一个临时区域里
3.执行finally语句块,若finally语句有返回值,则此返回值将替换掉临时区域的返回值
4.在降临时区域的返回值送到上一级方法中


try、catch、finally都有return

1.在没有异常的情况下,try中的返回值先保存到临时区域里,再去执行finally,这个finally有返回值,这个返回值将之前try保存到临时区域的值替换掉,再将这个临时区域中的值返回到上一级方法。

2.如果有一场,则执行catch中的代码,这里的return将返回一个返回值放到临时区域,再去执行finally。这个finally有返回值,这样就将catch中存在临时区域中的值这个finally返回的值替换掉,再将这个临时区域的值返回给上一级。

总结:如果finally语句有返回值,则此返回值将会替换掉临时区域原来的值

验证:

public int amethod() {  
    try {  
        // 1,抛出异常  
        FileInputStream dis = new FileInputStream("test1.txt");  
    } catch (Exception ex) {  
        // 2.catch捕获异常,并执行  
        System.out.println("No such file found");  
        // 4,return 返回  
        return -1;  
    } finally {  
        // 3.finally一定会在return之前执行。(准确说,应该是return;语句)  
        System.out.println("Done finally");  
    }  
    return 0;  
}  

输出结果:

No such file found
Done finally
-1


总结

finally其实仅在return语句执行之前执行,如果return一个函数,则先执行这个函数,如果函数内有return语句,那么finally就会在这个return语句执行之前执行。如果catch中有返回值,而finally中也存在return返回值的话,则finally的返回值一定会替换掉catch中的返回值,因为catch中的返回值是存放在一个临时区域,try相同。

除非调用system.exit()让程序退出,也就是将调用的这个程序的进程断开,退出这个程序(断电等因素致使程序停止,进程终止),否则无论如何finally块都一定会执行

-------------本文结束感谢您的阅读-------------
您的支持将鼓励我继续创作!