异常

Q:被检查的异常和不受检查的异常有什么区别?

  • 受检查异常
    • 被检查的异常应该用try-catch块代码处理,或者在main方法中用throws关键字让JRE了解程序可能抛出哪些异常。
    • Exception是所有被检查异常的基类
    • 被检查的异常适用于那些不是因程序引起的错误情况,比如:读取文件时文件不存在引发的FileNotFoundException
  • 不受检查异常
    • 不受检查的异常在程序中不要求被处理或用throws语句告知。
    • RuntimeException是所有不受检查异常的基类。
    • 不被检查的异常通常都是由于糟糕的编程引起的,比如:在对象引用时没有确保对象非空而引起的NullPointerException

Q:异常处理的原理?

Java虚拟机用方法调用栈(method invocation stack)来跟踪每个线程中一系列的方法调用过程。如果在执行方法过程中抛出异常,则Java虚拟机必须找到能捕获该异常的catch代码块。当Java虚拟机追溯到调用栈的底部的方法的时候,如果仍然没有找到处理该异常的代码块,这样它就会按步骤处理,首先会打印方法调用栈的异常信息,然后如果所处的线程不是主线程,那么就会终止这个线程

Q:try-finally-return执行顺序?

public class TestReturn {
    public int test(){
        int x  = 1;
        try{
            return ++x;
        }
        catch(Exception e){

        }finally{
            return ++x;
        }

        //return x;
    }
    public static void main(String[] args){
        TestReturn t = new TestReturn();
        int result = t.test();
        System.out.println(result);//2
    }
}
  • 遇到return语句时会在局部变量区额外分配一块空间存储值,待代码执行完毕会直接返回这个值
  • 如果finally中有return的话,会以finally中的return为准