有关异常的常见面试题

来源:互联网 发布:手机怎么激活淘宝店铺 编辑:程序博客网 时间:2024/05/16 12:11

一、java中的两种异常:受检查异常和不受检查异常

不受检查异常又叫做运行时异常,这些异常都是runtimeException的子类,如NullPointerException空指针异常、IndexOutOfBoundsException下标越界异常。这一类异常是在程序运行时可能发生的,不要求一定要捕获该异常,一般是因为错误的程序逻辑引起的,想要解决此类异常需要仔细排查程序。

受检查异常指的时除去不受检查异常以外的所有异常,由Exception和其子类组成,包括IOException和SQLException等,这一类异常必须要显示的try catch捕获或抛出throws,否则程序不能编译通过。


二、Exception和Error的关系:两者的父类都是throwable 

区别是:error出现的原因一般都与java虚拟机有关,如系统崩溃、内存泄漏等,出现这种情况会导致程序中断,且不能依靠程序本身来预防和解决,一般建议程序结束,不建议程序捕获。

Exception表示程序可以处理的异常,这些异常可以捕获且有可能被处理,当出现异常时,建议在程序中捕获处理,不应该随意终止异常。


三、throw和throws的区别:

throws E1,E2,E3只是告诉程序这个方法可能会抛出这些异常,方法的调用者可能要处理这些异常,而这些异常E1,E2,E3可能是该函数体产生的。
throw则是明确了这个地方要抛出这个异常。

如: void doA(int a) throws Exception1,Exception3{
           try{
                 ......

           }catch(Exception1 e){
              throw e;
           }catch(Exception2 e){
              System.out.println("出错了!");
           }
           if(a!=b)
              throw new  Exception3("自定义异常");
}

代码块中可能会产生3个异常,(Exception1,Exception2,Exception3)。
如果产生Exception1异常,则捕获之后再抛出,由该方法的调用者去处理。
如果产生Exception2异常,则该方法自己处理了(即System.out.println("出错了!");)。所以该方法就不会再向外抛出Exception2异常了,void doA() throws Exception1,Exception3 里面的Exception2也就不用写了。
而Exception3异常是该方法的某段逻辑出错,程序员自己做了处理,在该段逻辑错误的情况下抛出异常Exception3,则该方法的调用者也要处理此异常。

1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

4、throw一个必须在函数后面throws声明一下;反过来则大可不必


异常处理完后,Exception对象会在下一个垃圾回收周期被回收掉


原创粉丝点击