【007期】JavaSE面试题(七):异常

开篇介绍

你们好,我是Java最全面试题库的提裤姐,今天这篇是面试系列的第七篇,主要总结了JavaSE中异常类相关面试题,在后续,会沿着第一篇开篇的知识线路一直总结下去,作到日更!若是我能作到百日百更,但愿你也能够跟着百日百刷,一百天养成一个好习惯。java

说一下Java中的异常体系?

Java的异常体系

Error和Exception的区别?

Error(错误)
系统中的错误,是在程序编译时出现的错误,只能经过修改程序才能修正。通常是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。 面试

Exception(异常)
表示程序能够处理的异常,能够捕获且可能恢复。遇到这类异常,应该尽量处理异常,使程序恢复运行,而不该该随意终止异常。数组

写出你最多见的 5 个 RuntimeException?

  • java.lang.NullPointerException 空指针异常;出现缘由:调用了未经初始化的对象或者是不存在的对象。
  • java.lang.ClassNotFoundException 指定的类找不到;出现缘由:类的名称和路径加载错误;一般都是程序

试图经过字符串来加载某个类时可能引起异常。函数

  • java.lang.NumberFormatException 字符串转换为数字异常;出现缘由:字符型数据中包含非数字型字符。
  • java.lang.IndexOutOfBoundsException 数组角标越界异常,常见于操做数组对象时发生。
  • java.lang.IllegalArgumentException 方法传递参数错误。
  • java.lang.ClassCastException 数据类型转换异常。

如何处理异常?

异常的处理方式有两种:测试

  • ⾃⼰处理。
  • 向上抛, 交给调⽤者处理。

具体的处理方式的选择原则:spa

  • 本身明确的知道如何处理的, 就要处理掉。
  • 不知道如何处理的, 就交给调⽤者处理。
注:异常, 不能捕获了以后什么也不作。或者只是使⽤e.printStacktrac

try()里面有⼀个return语句, 那么后面的finally{}里面的代码会不会被执行?何时执行,return前仍是return后?

若是try中有return语句, 那么finally中的代码仍是会执⾏。
由于return表示的是要整个方法体返回, 因此,finally中的语句会在return以前执⾏。
可是return前执行的finally块内,对数据的修改效果对于引用类型和值类型会所不一样:指针

// 测试 修改值类型

static int f() {

    int ret = 0;

    try {

        return ret;  // 返回 0,finally内的修改效果不起做用

    } finally {

        ret++;

        System.out.println("finally执行");

    }

}



// 测试 修改引用类型

static int[] f2(){

    int[] ret = new int[]{0};

    try {

        return ret;  // 返回 [1],finally内的修改效果起了做用

    } finally {

        ret[0]++;

        System.out.println("finally执行");

    }

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

public int getNum() {

        try {

            int a = 1 / 0;

            return 1;

        } catch (Exception e) {

            return 2;

        } finally {

            return 3;

        }

    }

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

throw 和 throws 的区别?

throw:orm

  • throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。
  • throw 是具体向外抛出异常的动做,因此它抛出的是一个异常实例,执行 throw 必定是抛出了某种异常。

throws:对象

  • throws 语句是用在方法声明后面,表示若是抛出异常,由该方法的调用者来进行异常的处理。
  • throws 主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道须要捕获的异常的类型。
  • throws 表示出现异常的一种可能性,并不必定会发生这种异常。
相关文章
相关标签/搜索