面试直击之JavaSE复习day5——Java异常处理

    技术2022-07-10  80

    1.Java一异常架构

    2.java中异常分为哪些种类

    1)按照异常需要处理的时机分为编译时异常(CheckedException)和运行时异常(RuntimeException)。

    编译时异常(受查异常):Java编译去会检查它。如果程序中出现此类异常,比如ClassNotFoundException(没有找到指定的类异常),IOException(IO流异常),要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。即对编译时异常处理方法有两种:①当前方法知道如何让处理该异常,则用try-catch块来处理异常。  ②当前方法不知道如何处理,则在定义该方法时声明抛出该异常

    运行时异常(不受查异常):此类异常属于不受检异常,一般是由程序逻辑错误引起的,在程序中可以选择捕获处理,也可以不处理。虽然Java编译器不会检查运行时异常,但是我们也可以通过throws进行声明抛出,也可以通过try-catch对它进行捕获处理。如果产生运行时异常,则需要通过修改代码来进行避免,例如发生除数为0的情况,需要修改代码避免此类情况的发生。运行时异常会由Java虚拟机自动抛出并进行捕获(就算我们没有写捕获语句,运行时也会抛出错误代码),此类异常的出现绝大多数情况是代码本身有问题应该从逻辑上去解决并改进代码。

    3.Java异常处理机制

    Java对异常进行了分类,不同类型的异常分别用不同的java类表示,所有的异常的跟类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception,Error表示应用程序本身无法克服和恢复的一种严重问题。Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是开发人员考虑不周所导致的问题,软件使用者无法克服华人恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如:数组脚本越界,空指针异常,类转化异常;普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如:网络短线,硬盘空间不够,发生这样子的异常,程序不应该死掉。

    Java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须用try-catch处理或者用throws申明继续抛给上层调用方法处理,所以普通异常也成为checked异常,而系统异常可以处理也可以不处理,所以,编译器不强制用try-catch处理或throws声明,所以系统异常也成为unchecked异常。

    4.异常处理关键字

    ①try:用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就会被抛出。

    ②catch:用于捕获异常。catch用来捕获try语句中发生的异常

    ③finally :finally语块总是会被执行,它主要用于回收try块里打开的资源(如数据库连接,网络连接和磁盘文件)。至于finally块执行完之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。

    ④throw:用于抛出异常。如果你觉得解决不了某些异常问题,切不需要调用者处理,就可以抛出异常。

    ⑤throws:用在方法签名中,用于声明该方法可能抛出异常。

    那么如何选择异常类型(声明异常还是抛出异常)呢?可根据下图做出判断 

    5.一个面单的面试题:调用下面方法,得到的返回值是什么?

    1 public int getNum(){ 2 try{ 3 int a=1/0; 4 return 1; 5 }catch{ 6 return 2; 7 }finally{ 8 return 3; 9 } 10 }

    解答:代码按照顺序走,在第三行的时候会遇到一个MathException,这时第四行的代码就不会执行了,代码直接跳转到catch语句中,走到第六行的时候,异常机制有这么一个原则在catch中遇到return语句或者异常等能使函数终止的话,那么有finally就必须先执行finally代码块里面的代码然后再返回值,因此代码又跳到了第八行,可惜在第八行是一个return语句,那么这个时候方法就结束了,因此第六行的返回结果就无法被真正返回。如果finally仅仅是一处理了一个释放资源的操作,那么该道题在最终返回的结果就是2,因此上面代码的的返回值是3。

    6.error和Exception的区别?

    Error和Exception类的父类都是Throwable类,他们的区别如下:

    Error类一般是指虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。对于这类错误导致的应用程序中断,仅靠程序本身是无法恢复和预防的,遇到这样的错误,应该让程序终止。

    Exception类有分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception),运行时异常编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止,而受检查的异常,要么用try-catch捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。

    7.写出最常见的RuntimeException

    1)java.lang.NullPointerException 空指针异常,出现原因:调用了未经初始化的对象或者不存在的对象。

    2)java.lang.ClassNotFoundException  指定的类找不到,出现原因:类的名称和路径加载错误,通常都是程序试图通过字符串来加载某个类时可能引发异常。

    3)java.lang.IndexOutOfBoundsException  数组下标越界异常,常见于操作数组对象时发生。

    4)java.lang.ClassCastException   数组类型转换异常

    5)java.lang.illegalArgumentException  方法传递参数错误

    8.throw和throws的区别

    throw:

    1)throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。

    2)throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。

    throws:

    1)throws语句使用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。

    2)throws主要是声明这个方法会抛出某种类型的异常,让它的使用者知道需要捕获的异常的类型。

    3)throws表示出现异常的一种可能性,并不一定会发生这种异常。

    9.final,finally,finalize的区别?

    1)final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可被继承。

    2)finally:异常处理语句结构的一部分,表示总是执行。

    3)finalize:Object类的一个方法,在垃圾回收执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象声明周期的临时方法,当该方法被系统调用则代表该对象即将死亡,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对象死亡,这是一个被动的方法(其实就是回调方法),不需要我们调用。

    Processed: 0.059, SQL: 9