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