欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java面试题07_异常

程序员文章站 2022-04-12 13:15:48
...

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

java面试题07_异常

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类的一个方法,在垃圾收集器执行的时候,会调用被回收对象的此方法,可以覆盖此方法,提供垃圾收集时的其他资源回收,例如关闭文件等。
相关标签: java面试题 java