十六 Java异常,try...catch...finally执行流程

来源:互联网 发布:windows 锁屏快捷键 编辑:程序博客网 时间:2024/06/05 06:02

Java异常分类

从大体上来看,分为俩部分:

error—错误

是指程序无法处理的错误,表示应用程序运行时出现的重大错误。例如jvm运行时出现的OutOfMemoryError以及Socket编程时出现的端口占用等程序无法处理的错误。

Exception — 异常

异常可分为运行时异常跟编译异常。

  • 运行时异常:即RuntimeException及其之类的异常。这类异常在代码编写的时候不会被编译器所检测出来,是可以不需要被捕获,但是程序员也可以根据需要进行捕获抛出。常见的RUNtimeException有:NullpointException(空指针异常),ClassCastException(类型转换异常),IndexOutOfBoundsException(数组越界异常)等。

  • 编译异常:RuntimeException以外的异常。这类异常在编译时编译器会提示需要捕获,如果不进行捕获则编译错误。常见编译异常有:IOException(流传输异常),SQLException(数据库操作异常)等。


难点

Java异常机制

抛出异常以及捕获异常 ,一个方法所能捕捉的异常,一定是Java代码在某处所抛出的异常。简单地说,异常总是先被抛出,后被捕捉的。
##throw跟throws的区别:

public void test thorws Exception(){    throw new Exception();}

从上面这一段代码可以明显的看出两者的区别。throws表示一个方法声明可能抛出一个异常,throw表示此处抛出一个已定义的异常。

try…catch…finally执行流程

正常来说,try会按循序执行的:当不存在异常时,try执行完后,在执行finally中的代码;当存在异常时,try执行到异常处,执行catch处代码块,最后执行finally。
然而,在实际中会遇到如下问题:

finally中不存在return

来看下面的代码:

package file;public class TryCatchDemo {    public static int dd() {        int x = 1;        int y = 1;        int z ;        try {            System.out.println("try");            z = x / y;            return 1;        }catch(Exception e) {            System.out.println("catch");            return 2;        }finally {            System.out.println("finally");        }    }    public static void main(String[] args) {        System.out.println(dd());    }}

不存在异常,结果为:

tryfinally1

同样是上面的代码,将 y = 1 ;修改为 y = 0 ;让方法抛出异常,执行代码的结果为:

trycatchfinally2

总结:不论是否存在异常,finally会在try…catch的return前执行。


finally中存在return

在上面的代码中,在finally中添加return。
然后先来看看没有异常时的输出。

public class TryCatchDemo {    public static int dd() {        int x = 1;        int y = 1;        int z ;        try {            System.out.println("try");            z = x / y;            return 1;        }catch(Exception e) {            System.out.println("catch");            return 2;        }finally {            System.out.println("finally");            return 3;        }    }    public static void main(String[] args) {        System.out.println(dd());    }}

结果为:

tryfinally3

同上,将代码中的 y = 1;修改为 y = 0;时方法抛出异常,得到结果为:

trycatchfinally3

总结:不论是否存在异常,finally还是会在try…catch代码块的return前执行,返回自己代码块中的return

注意:当存在异常时,这里会输出try,是因为在try代码块中,输出语句在出现异常前,所以可以输出,反之不会输出,就跑异常了。

这个面试的时候经常考,要好好运行感受一下。


阅读全文
0 0
原创粉丝点击