JavaSE面试题(七):异常

在这里插入图片描述

Q1:说一下Java中的异常体系?

在这里插入图片描述

Q2:Error和Exception的区别?
Error (错误):

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

Exception (异常):

       表示程序可以处理的异常,可以捕获且可能恢复。遇到该类异常,应尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

Q3:写出你最常见的5个RuntimeException?
  • java.lang.NullPointerException(空指针异常):调用了未经初始化的对象或者是不存在的对象。
  • java.lang.ClassNotFoundException(指定的类找不到):类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引发的异常。
  • java.lang.NumberFormatException(字符串转化为数字异常):字符型数据中包含非数字型字符。
  • java.lang.IndexOutOfBoundsException(数组下标越界异常):常见于操作数组对象时发生。
  • java.lang.IllegalArgumentException:方法传递参数错误。
  • java.lang.ClassCastException:数据类型转换异常。
Q4:如何处理异常?
1、异常处理的两种方式
  • 自己处理
  • 向上抛,交给调用者处理。
2、具体的处理方式的选择原则
  • 自己明确的知道如何处理,就要处理掉。
  • 不知道如何处理,就交给调用者处理。
    注:异常, 不能捕获了之后什么也不做。或者只是使⽤e.printStacktrac
Q5:try()里面有⼀个return语句, 那么后面的finally{}里面的代码会不会被执行?什么时候执行,return前还是return后?
  • 如果try中有return语句,那么finally中的代码还是会执行的。
  • 因为return表示的是要整个方法体返回,所以,finally中的语句会在try中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执行了···");
        }
    }
Q6:调用下面方法会返回什么值?

异常机制:

有这么一个原则,如果在catch中遇到return或者异常等能使函数终止的事件,那么有finally就必须先执行完finally代码块里边的代码然后再返回catch/try中的返回值

分析:

代码走到第3行的时候会遇到一个MathException,这时第四行的代码就不会执行了,代码直接跳转到catch语句中,走到第6行的时候(异常机制),因此代码又跳到第8行,可惜第8行是一个return语句,那么这个时候方法就结束了,因此第6行的返回结果就无法被真正返回。(如果finally仅仅是处理了一个释放资源的操作,那么该道题最终返回的结果就是2。)因此上面返回值是3

1    public int getNum(){
2        try {
3            int i=1/0;
4            return 1;
5        }catch (Exception e){
6            return 2;
7        }finally {
8            return 3;
9        }
10    }
Q7:throw和throws的区别?

throw:

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

throws:

  • throws语句是用在方法声明后边,表示如果抛出异常,由该方法的调用者来进行异常的处理。
  • throws主要是声明这个方法抛出某种类型的异常,让它的使用者知道需要知道需要捕获的异常的类型。
  • throws表示出现异常的一种可能性,并不一定会发生这种异常。
Q8:java 中 finally 块一定会执行吗?

答:不一定,分情况。

  • 因为首先想要执行 finally 块的前提是必须执行到了 try 块,当在 try 块或者 catch 块中有 System.exit(0); 这样的语句存在时 finally 块就不会被执行到了,因为程序被结束了。
  • 此外当在 try 块或者 catch 块里 return 时 finally 会被执行;而且 finally 块里 return 语句会把 try 块或者 catch 块里的 return 语句效果给覆盖掉且吞掉了异常。
    static void f3(){
        try {
            int i=10/0;
            System.out.println("try");
        }
        catch (Exception e){
            System.out.println("catch");
            System.exit(1);
        }
        finally {
            System.out.println("finally");
        }
    }
Q9:谈谈final、finally、finalize区别?
  • final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。
  • finally是异常处理语句结构的一部分,表示总是执行。
  • finalize是 Object类的一个方法,在垃圾收集器执行的时候,会调用被回收对象的此方法,可以覆盖此方法,提供垃圾收集时的其他资源回收,例如关闭文件等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值