关于java中Exception的一些理解

来源:互联网 发布:电子取证软件 编辑:程序博客网 时间:2024/05/18 13:45

Exception中关键字

throws:

在方法的声明时使用,作用是声明该方法 可能 有该种异常,不一定会有,是一种倾向,一种预防措施,保证代码的健壮性。让你的调用者知道,我这个方法可能会抛出何种异常,让我的调用者知道并且要做出一定的处理。因此就要求其调用者做出一定“防范措施”来进行捕获可能会抛出的异常并解决或者进行继续抛出(不推荐)。例如进行try catch解决。
public void method1() throws XXXException,YYYException {//方法体}
//声名多个异常时异常之间用逗号隔开
public void method2(){
//调用method1,因为method1声明了他可能用两种异常,所以在这就要做出防范措施,也就是捕获处理
try{method1();}
catch(XXXException e1){
//处理方式
}
catch(YYYException e2){
//处理方式
}
}

当然你也可以不用在这进行catch处理,而是进行继续抛出,

public void method2()throws XXXException,YYYException {method1();}
这样之后异常的处理就交给了method2()的调用者。。类似的进行向上层层抛出。当然无论怎么抛出,最后都要有一个调用者解决,最终的调用者是jvm,也就是说如果一直没解决,那么就只能有jvm来解决,jvm的解决方法很简单,就是吧你的异常信息打印出来..也就是我们常见的红字

throw

在该方法内部使用,此时就是真的抛出了一个异常,作用就是抛出异常对象给调用者,自己不处理。如果调用者也不处理,那么就会层层抛出,直到有调用者处理或者最终抛给虚拟机,虚拟机的处理方式就是打印你的异常信息,也就是我们经常看到的红字。。但是一般运行时异常都不会选择抛出,而是在方法中直接catch处理了。。
public int method1(int[] a ,int i) {
if(i>a.length())
throw new ArrayIndexOutOfBoundsException("自定义信息");
else
return a[i];
}

如果i>a.length()了,那么就会抛出一个下标越界的异常对象,方法本身不作处理。仅仅把异常抛出。当然这种方式我们并不推荐,这是一种消极的处理方式。

RuntimeException(运行时异常)

出现这种异常编译可以通过,但是运行时会报错,例如上面的数组下表越界异常,对于这种运行时异常,我们一般不采用throws进行声明,而是进行自定义抛出(用throw关键字)方式或者虚拟机默认的抛出方式抛出(不做任何处理),然后在和控制台答应异常信息来让程序员进行修改。当然也可以进行catch捕获然后进行处理,并进行日志保存。。具体要用那种方式要根据程序的要求来灵活选择,是要在程序中依靠程序自己处理还是要由控制台打印错误信息,由程序的具体功能来决定。

非运行时异常

除了runtimeException及其子类以外其他所有Exception的子类都是非运行时异常
这种异常又被称为编译时异常,必须声明或者捕获,不然编译不通过。也就是说这些异常是必须要在方法声明中throws Exception,而且所有此方法的调用者如果不写try catch的话就要一直throws Exception,一直到main方法为止。如果不throws,就一定要try catch,如果一个应该抛出非RuntimeExcetion的方法既没有throws Exception也没有try catch,一定会报错的,编译无法通过。
另外异常处理的原则是尽可能早的catch异常,正常的程序不应该写throws Exception。

0 0
原创粉丝点击