一个异常的面试题

563 阅读2分钟

下午群里的小伙伴发了一倒面试题

  • 对于这个问题,该是什么了,有的人说是int try,有的说是finally,有的说的两个都输出,那么正确答案是什么了?

Java 异常

异常处理

try{
 //可能发生异常
}catch(Exception e){
 //捕获异常
}finally{
 // 有无异常都会执行 
}

finally 中的代码有以下情况

  • 1 没有异常发生,在try结束后执行
  • 2 有异常发生并被捕获,在catch执行后执行
  • 3 有异常发生但没有捕获,则异常在被抛给上层之前执行

return

    public static int anInt() {
        int ret = 0;
        try {
            return ret;
        } finally {
            ret = 2;
        }
    }

结论:这个函数返回值是0,而不是2,因为函数执行到try内return语句之前,会将返回值保存到一个临时变量中,然后执行finally语句,最后在返回那个临时变量,即finally对ret的修改不会生效

return

    public static int anInt() {
        int ret = 0;
        try {
            int a = 10 / 0;
            return ret;
        } finally {
            ret = 2;
        }
    }

结论: 输出2

原因a = 10 / 0 会抛出ArithmeticException,finally中有return不仅会覆盖try和catch的值,还会掩盖try和catch的异常

return

    public static int anInt() {
        int ret = 0;
        try {
            int a = 10 / 0;
            return ret;
        } finally {
           throw new NullPointerException("NullPointerException");
        }
    }

finally中异常会覆盖try和catch的异常

面试题答案

规则3,既只会输出finally

本文使用 mdnice 排版