实际项目开发中肯定少不了异常的处理,了解自定义 异常 和全局异常处理让我们更加愉快的工作
一、常见的异常
- NullPointerException===============>空指针异常
- ClassCastException================>类型强制转换异常
- IndexOutOfBoundsException=========>索引越界异常
- SQLException====================>操作数据库异常
- IOException======================>输入输出异常
- NoSuchMethodException============>方法未找到异常
- ClassNotFoundException============>类找不到异常
- java.lang.IllegalAccessError==========>违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。
- java.lang.ExceptionInInitializerError====>初始化程序错误。当执行一个类的静态初始化程序的过程中,发生了异常时抛出。静态初始化程序是指直接包含于类中的static语句段。
PS: 异常还有很多,以上只是列举了一些常见的异常,更加详细的异常种类介绍请参考 这里
二、异常的处理
异常处理的方式无外乎两种:
try/catch
发现异常,立即处理throw
往上抛出,交给调用者处理
1、捕获异常示例:
public class ExcepTest{
public static void main(String args[]){
int a[] = new int[2];
try{
System.out.println("Access element three :" + a[3]);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("Exception thrown :" + e);
}finally{
a[0] = 6;
System.out.println("First element value: " +a[0]);
System.out.println("The finally statement is executed");
}
}
}
/** * 注意下面事项: * 1、catch 不能独立于 try 存在。 * 2、在 try/catch 后面添加 finally 块并非强制性要求的。 * 3、try 代码后不能既没 catch 块也没 finally 块。 * 4、try, catch, finally 块之间不能添加任何代码。 */
2、抛出示例:
public class className{
public void withdraw() throws RemoteException,InsufficientFundsException{
// Method implementation
}
}
/** * 注意下面事项: * 1、如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。 * 2、throws 关键字放在方法签名的尾部 * 3、一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。 */
三、自定义异常
public class RequiredFieldIsNullException extends RuntimeException{
//使用父类的无参构造
public RequiredFieldIsNullException(){
super();
}
//使用父类的String传参构造
public RequiredFieldIsNullException(String msg){
super(msg);
}
}
/** * 注意下面事项: * 1、所有异常都必须是 Throwable 的子类。 * 2、如果希望写一个检查性异常类,则需要继承 Exception 类。 * 3、如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。 */
四、全局异常处理
@RestControllerAdvicehttps 注解详情
@RestControllerAdvicehttps
public class GlobalExceptionAdvice {
//捕获异常并对异常进行响应的处理
@ExceptionHandler(RequiredFieldIsNullException.class)
public Result<Object> RequiredFieldIsNullException(RequiredFieldIsNullException e){
//todo 捕获异常后的逻辑处理
}
}