zoukankan      html  css  js  c++  java
  • 面试之Java异常处理

    精选归类:异常处理的面试题:

    1、error和exception有什么区别

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

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

    Exception 类表示程序可以处理的异常,需要捕捉、需要处理的异常,是由与程序设计的不完善而出现的问题,程序必须处理的问题

    2、运行时异常和一般异常有何不同

    Exception 类又分为运行时异常(RuntimeException)和受检查的异常(CheckedException )

    一般异常(checkedException)主要是指IO异常、SQL异常等。对于这种异常,JVM要求我们必须对其进行cathc处理,所以,面对这种异常,不管我们是否愿

    意,都是要写一大堆的catch块去处理可能出现的异常。如果程序没有处理 CheckedException异常,该程序在编译时就会发生错误无法编译

    运行时异常(runtimeException)我们一般不处理,当出现这类异常的时候程序会由虚拟机接管。

    例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException)

    出现运行时异常的时候,程序会将异常一直向上抛,一直抛到遇到处理代码,如果没有catch块进行处理,到了最上层,如果是多线程就有Thread.run()抛出,如

    果不是多线程那么就由main.run()抛出。抛出之后,如果是线程,那么该线程也就终止了,如果是主程序,那么该程序也就终止了。

    其实运行时异常的也是继承自Exception,也可以用catch块对其处理,只是我们一般不处理罢了,也就是说,如果不对运行时异常进行catch处理,那么结果不

    是线程退出就是主程序终止。

    如果不想终止,那么我们就必须捕获所有可能出现的运行时异常。如果程序中出现了异常数据,但是它不影响下面的程序执行,那么我们就该在catch块里面将异

    常数据舍弃,然后记录日志。如果,它影响到了下面的程序运行,那么还是程序退出比较好些。

    3、Java中异常处理机制的原理

    Java通过面向对象的方式对异常进行处理,Java把异常按照不同的类型进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它都是Throwable

    或其子类的实例。当一个方法出现异常后就会抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并对异常进行处理。Java的

    异常处理是通过5个关键词来实现的:try catch  throw throws finally。

    一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws),我们可以通过它的类型来捕捉它,或最后由缺省处理器来处理它(finally)。

    try:用来指定一块预防所有异常的程序

    catch:紧跟在try后面,用来捕获异常

    throw:用来明确的抛出一个异常

    throws:用来标明一个成员函数可能抛出的各种异常

    finally:确保一段代码无论发生什么异常都会被执行的一段代码。

    4、你平时在项目中是怎样对异常进行处理的。

    (1)尽量避免出现runtimeException 。例如对于可能出现空指针的代码,带使用对象之前一定要判断一下该对象是否为空,必要的时候对runtimeException

    也进行try catch处理。

    (2)进行try catch处理的时候要在catch代码块中对异常信息进行记录,通过调用异常类的相关方法获取到异常的相关信息,返回到web端,不仅要给用户良好

    的用户体验,也要能帮助程序员良好的定位异常出现的位置及原因。

    7. final、finally、finalize 的区别?
    1)final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。
    2)finally:异常处理语句结构的一部分,表示总是执行。
    3)finalize:Object 类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法
    提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法,当该方法
    被系统调用则代表该对象即将“死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对
    象“死亡”,这是一个被动的方法(其实就是回调方法),不需要我们调用。

    8.调用下面的方法,得到的返回值是什么?

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

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

    9.throw 和 throws 的区别

    throw:
    1)throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。
    2)throw 是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行 throw 一定是抛出了某种异常。
    throws:
    1)throws 语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
    2)throws 主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
    3)throws 表示出现异常的一种可能性,并不一定会发生这种异常。

    10.请写出你最常见的 5 个 RuntimeException

    一些受检CHECKED异常:

     

    11.如果执行finally代码块之前方法返回了结果,或者JVM退出了,finally块中的代码还会执行吗?

    不会,只有在try里面是有System.exit(0)来退出JVM的情况下finally块中的代码才不会执行。否则finally块中的代码都会执行。

    思路:了解try.cath.finally的执行顺序就会迎刃而解,首先会执行try里面的代码,执行完了会查找有没有finally,如果没有,直接执行return或者是throw,

    如果有finally,先执行finally里面的代码,再执行try里面的 return或者是throw;

    一般来讲finally里面不会写return或者是throw,如果写了,会覆盖掉try里面的return和throw。

  • 相关阅读:
    PHP返回XML与JSON数据
    Canvas学习-1
    PHP与cURL
    PHP调用SOAP Webservice
    Ubuntu查找文件是否安装
    API Centeric Web Application论文
    Git学习2
    An invalid character [32] was present in the Cookie value
    关于eclipse项目的x号报错的一些问题
    关于eclipse的项目前有感叹号和errors exist in required project相关问题
  • 原文地址:https://www.cnblogs.com/chenshuyong/p/10029433.html
Copyright © 2011-2022 走看看