Java中异常处理

来源:互联网 发布:网络电子赌博的危害 编辑:程序博客网 时间:2024/05/17 21:39

浅析Java异常处理


一、什么是异常?

1 异常

异常本质上是程序上的错误,包括程序逻辑错误和系统错误,如使用空的引用、数组下标越界、内存溢出错误等;

Java提供异常处理机制,通过异常处理机制处理程序运行期间出现的错误,可提升程序的健壮性;


2 分类

Java把异常当作对象来处理,根类java.lang.Throwable类,包括Error和Exception;

2.1 Error

Error是无法处理的异常(如OutOfMemoryError),一般发生这种异常JVM会选择终止程序,因此编写程序时不关心该异常;

2.2 Exception

Exception是可以处理的异常(如NullPointerException、IndexOutOfBoundsException),包括checked exception和unchecked exception(运行时异常,并不是前面所说的运行期间的异常,只是Java中用运行时异常这个术语表示,Exception类的异常都是在运行期间发生的);

2.2.1 unchecked exception(非检查异常)

又Runtime Exception(运行时异常),Java编译器不要求必须进行异常捕获处理或抛出声明,由程序员决定;

2.2.2 checked  exception(检查异常)

又非运行时异常,Java编译器强制程序员必须进行捕获处理,否则编译器不通过;


3 异常类的结构层次



二、如何处理异常?

1 异常捕获处理

先对异常进行捕获,再对异常情况进行处理;

try块包围的代码表示可能会发生异常,一旦发生异常,catch捕获异常,并在catch块进行异常处理;

try{File file = new File("F:\exception.java");if(!file.exists()){file.createNewFile();}}catch(IOException e){// TODO: handle exception}


2 抛出异常

一旦发生异常,将该异常抛出,让调用者进行处理,自己不做具体处理;

使用throw和throws关键字;

如下,与第一种方法区别是在createFile()方法中没有捕获异常,而是用throws关键字声明抛出异常,即告知该方法的调用者此方法可能会抛出异常,则main()方法中调用createFile()方法时,采用try/catch块进行异常捕获处理;

public class Main {    public static void main(String[] args) {        try {            createFile();        } catch (Exception e) {            // TODO: handle exception        }    }         public static void createFile() throws IOException{        File file = new File("d:/a.txt");        if(!file.exists())            file.createNewFile();    }}

还可以采用throw关键字手动抛出异常对象;

public class Main {    public static void main(String[] args) {        try {            int[] data = new int[]{1,2,3};            System.out.println(getDataByIndex(-1,data));        } catch (Exception e) {            System.out.println(e.getMessage());        }             }         public static int getDataByIndex(int index,int[] data) {        if(index<0||index>=data.length)            throw new ArrayIndexOutOfBoundsException("数组下标越界");        return data[index];    }}


3 总结——三种方法进行异常处理

3.1 对代码块用try/catch进行异常捕获处理

3.2 在该代码的方法体外用throws进行抛出异常,告知此方法的调用者这段代码可能会出现异常

若声明抛出的异常是非运行时异常,此方法的调用者必须显式地用try/catch块进行捕获或继续向上层抛出异常;

若声明抛出的异常是运行时异常,此方法的调用者可选择性地进行异常捕获处理;

3.3 在该代码块内用throw手动抛出一个异常对象

若声明抛出的异常是非运行时异常,此方法的调用者必须显式地用try/catch块进行捕获或继续向上层抛出异常;

若声明抛出的异常是运行时异常,此方法的调用者可选择性地进行异常捕获处理;


三、深刻理解try, catch, finally, throw, throws关键字

1 try, catch, finally

try关键字包围可能会出现异常的逻辑代码,无法单独使用,必须配合catch或finally使用;

Java编译器允许的组合使用形式只有三种——try/catch, try/finally, try/catch/finally;

try块只能有一个,catch块可有多个,finally块最多有一个;

三个块执行顺序是try->catch->finally;

若没有发生异常,catch块不会执行,finally块无论什么情况下都会执行,因此finally块通常用于释放资源;

catch块有多个时,按照先后顺序进行匹配,一旦异常类型被一个catch匹配,则不会再与后面的catch块进行匹配;

注意:

若catch块中有return语句,则会先执行finally块,再回头执行return语句;

一定不要在finally块中使用return语句,因为finally中的return会覆盖已有的返回值;


2 throw, throws

2.1 throws

throws关键字出现在方法的声明中,表示该方法可能会抛出异常,再交给上层调用它的方法程序处理,允许throws后跟多个异常类型;

2.2 throw

throw关键字一般用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常;

只会在方法体内,当方法在执行过程中出现异常,将异常信息封装为异常对象throw出去;

主要用途是异常类型的转换;


四、在类继承时方法覆盖如何进行异常抛出声明?

1 父类的方法没有声明异常,子类在重写该方法时不可声明异常

2 若父类的方法声明一个异常exception1,则子类在重写该方法时声明的异常不能是exception1的父类

3 若父类的方法声明的异常类型只有非运行时异常(运行时异常),则子类再重写该方法时声明的异常只能是非运行异常(运行时异常)





注明:此文章是转载海子的博文,详情见:http://www.cnblogs.com/dolphin0520/p/3769804.html


0 0