当需要对发生异常(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