Java异常捕获(单级、多级)-try、catch、finally以及其执行顺序

    技术2024-06-08  82

       当需要对发生异常(Exception)的情况进行记录或处理时,需要使用try/catch捕捉异常。

    1. 单级捕获

        try 语句块中的staff为null,调用getAge方法时抛出NullPointerException,被catch语句捕捉,执行catch语句块内的打印逻辑。

    @Test void nullPointExceptionTest(){ Staff staff = null; try{ staff.getAge(); }catch (NullPointerException e){ e.printStackTrace(); } }

    执行结果


    java.lang.NullPointerException     at  ...


    2. 多级语句块

        有三级catch语句进行异常捕捉,捕获到的条件是try语句块抛出的异常是catch语句中的异常或者其子类,捕捉顺序为由上至下(上级catch的异常不能是下一级catch异常的超类(父类,superclass)),若第一级catch未捕获,则由下一级catch验证捕捉,若异常已被捕捉,则之后的catch语句块就不会再捕捉。

    2.1 示例1(第一级catch已捕获异常)

    @Test void nullPointExceptionTest(){ Staff staff = null; try{ staff.getAge(); }catch (NullPointerException e){ System.out.println("NullPointerException"); }catch (RuntimeException e){ System.out.println("RuntimeException"); }catch (Exception e){ System.out.println("Exception"); } }

    执行结果


    NullPointerException


    2.2 示例2 (第一级catch未捕获到异常)

    @Test void mutilLevelCatchTest1(){ ArrayList<Object> list = new ArrayList<>(); try{ list.get(7); }catch (NullPointerException e){ System.out.println("NullPointerException"); }catch (RuntimeException e){ System.out.println("RuntimeException"); }catch (Exception e){ System.out.println("Exception"); } }

    执行结果


    RuntimeException


    3. 若有返回值的函数中,try-catch-finally以及return的执行顺序。

      finally语句在return语句(无论是在try语句块还是catch语句块中)之前执行; 在执行finally语句之前,已将方法内的返回值保存起来,finally语句块对该值进行的操作都不会改变该值; @Test void tryCatchFinallySequenceTest(){ System.out.println(getStaffName()); } private String getStaffName(){ Staff staff = new Staff("Jerome", 26); try{ String name = ""; return staff.getName(); }catch (Exception e){ e.printStackTrace(); return ""; }finally { staff.setName("Chris"); System.out.println("Finally"); } } class Staff { String name; Integer age; public Staff(){ } public Staff(String name, Integer age){ this.name = name; this.age = age; } ... // getter setter }

    执行结果


    Finally Jerome


     

    Processed: 0.010, SQL: 9