Java中的异常机制

来源:互联网 发布:java怎么创建数组 编辑:程序博客网 时间:2024/06/11 15:17

    异常机制是一门成熟的编程语言必不可少的一部分,Java同样也提供了成熟的异常处理机制,来保证程序的健壮性。Java中的异常机制主要依赖于try、catch、finally、throw、throws五个关键字实现的,不同的关键字对应不同的异常处理方式。


异常


    Java中程序的非正常情况分为两种,一种是错误,也就是Error;一种是异常,也就是Exception,他们都是继承Throwable类。

                                                                


    Error:Error是错误,一般是与虚拟机相关的非正常情况,例如虚拟机错误、系统崩溃等,这种错误都是程序无法捕捉和处理的,遇到这种错误程序只能被终止。所以这些错误也不需要在程序中用catch块来捕获,或者采用throw关键字抛出Error或其子类。


    Exception:异常是除去错误的非正常情况,通常可以在程序中处理,或者规范代码就可以避免的问题。从上面的图可以看出,Exception分为SQLException、IOException和RuntimeException。SQLException是操作数据库会出现的异常,IOException是IO操作时会遇见的异常,RuntimeException是程序运行时可能会出现的异常,看名字也可以了解到。RuntimeException是经常会遇到的异常,经常见到的超出边界异常、类型转换异常、空指针异常,比如迭代一个集合,当集合为null时就会报空指针异常;如果迭代之前先判空,然后再进行处理,这种异常就是可以避免的。同样的,其他异常也可以。


关键字


    Java中异常机制的关键字有五个,分别是try、catch、finally、throw、throws。其中try和catch必须是成对出现的,不能只使用try或者catch;finally是需要跟在try...catch后面的,可以有也可以没有;throw和throws的作用是一样的,都是抛出异常,只不过用在不同的位置,throw用在方法体内,通常是在catch块中,而throws是使用在方法声明后面的。当方法声明后面有throws Exception时,在方法体内就不需要再使用try...catch或者throw了。


public void testException(){    FileInputStream fileInputStream = null;    try {        fileInputStream = new FileInputStream("D:\\test.txt");        fileInputStream.read();    }catch(FileNotFoundException e){        e.printStackTrace();    }catch (IOException e){        e.printStackTrace();    }finally {        try {            fileInputStream.close();        }catch (IOException e){            e.printStackTrace();        }    }}


    上面代码所示是try、catch、finally关键字的用法,try和catch必须成对使用,不能只写try块或者catch块,finally块可以写也可以不写。finally块,顾名思义,指的是最后执行的,它甚至可以在整个方法体执行完成之后执行。从异常块来看,不管try和catch块中如何执行,finally中的代码都会执行;对于整个方法来看,如果try、catch、finally中都有return,那么try和catch中的return结果都会被finally覆盖掉;因为finally不管怎样都会执行,通常会在finally中执行资源关闭的代码,保证资源一定会被关闭。同样的,异常块也是可以嵌套的,例如上面代码所示,当在finally中关闭fileInputStream时还会报出IOException,所以还可以再次进行一次try...catch来捕获异常。


public void testException() throws IOException{    FileInputStream fileInputStream = null;    try {        fileInputStream = new FileInputStream("D:\\test.txt");        fileInputStream.read();    }catch(IOException e){        throw new FileNotFoundException("文件未找到");    }finally {        try {            fileInputStream.close();        }catch (IOException e){            e.printStackTrace();        }    }}


    当出现某一个异常该方法处理不了的时候,可以抛出异常,让调用该方法的方法去处理,这时就可以使用throws或throw,如上面代码所示。throws用于方法声明后面,可以在方法上抛出异常;throw用于方法体内,需要和catch一起用。


注意事项


    1、异常类是有父子类之分的,所以如果代码中要使用多重catch,需要先catch子类异常,再catch父类异常。


    2、捕获异常时,尽量catch相应的异常,而不是为了图方便,直接catchException。通常需要catch异常时,IDE都会有提示需要捕获哪一类异常。


    3、异常机制虽然可以使得代码更健壮,但是也不能滥用异常,异常机制只能作为异常处理,尽量不要用来处理业务。


    4、try块中的代码不宜很长,最好是哪句代码需要捕获异常,就包含哪句代码。可以确定没有异常的,不需要写在try块中。


    5、finally中可以用来关闭程序中开启的资源,但是最好不要做方法的出口,会冲掉上面代码执行后的结果。


    6、catch中捕获的异常,一定要做异常处理,不要直接吞掉异常,最不济还要做一个堆栈打印。


    7、捕获异常后,能处理的异常要进行处理,不能处理的异常要抛给上层处理,但是抛出的异常一定要在程序的某一层进行处理。


总结


    既然异常可以通过某些代码的规范来规避,那么了解编码规范就必不可少,写代码的时候该注意的问题也一定要注意。而且尽量要把异常往前提,能在编译期处理的不要等到运行时,能在编译前处理的就直接处理掉。异常机制虽然让代码变得简单得体,但是也不要过度使用异常处理,同时也要注意异常处理的编写规范,提高代码的维护性。