前言
Throwable 类是所有错误(Error)和异常(Exception)的超类。
- Error:Error 类表示严重的问题,这些问题通常是Java虚拟机无法或不应该尝试解决的。Error 类及其子类通常表示系统级的错误。
- Exception:Exception类及其子类表示程序运行时可能会遇到的异常情况,这些异常通常是可以被程序本身捕获并处理的。Exception 类又进一步分为两大类:检查型异常(Checked Exceptions)和非检查型异常(Unchecked Exceptions)。
检查型异常:在编译时必须被显式处理,否则编译器会报错。处理检查型异常的方式通常是使用try-catch块捕获异常,或者在方法签名中使用throws关键字声明可能会抛出的异常。有这种异常如果不处理,编译都通不过,程序不能启动。
非检查型异常:也称为运行时异常(RuntimeException),这些异常在编译时不需要被显式处理。程序编译可以通过,运行时根据情况报出异常。
一. 检查型异常
检查型异常也就是直接继承Exception的异常(RuntimeException及其子类除外)。
如下我们定义一个检查型异常
public class CheckException extends Exception{
private String errorCode;
}
当我们使用这个异常时
如果我们不处理它,程序就会标红,编译通不过。
而处理它主要也有三种方式:
- 为其添加try/catch处理。
public void fun1(int testCode){ try { throw new CheckException(); } catch (CheckException e) { e.printStackTrace(); } }
- 使用 lombok的@SneakyThrows注解。
它允许开发者在方法签名中不显式声明受检异常(checked exceptions),而是将异常的抛出“隐藏”起来。当方法内部抛出了受检异常时,Lombok 会在编译时自动将这些异常包装成一个 RuntimeException 并抛出,从而避免了在方法签名中使用 throws 关键字。
使用 @SneakyThrows 可以减少代码中的样板代码(boilerplate code),使代码更加简洁。然而,它也可能导致调用者忽略潜在的错误情况,因为异常不会被强制处理。因此,在使用 @SneakyThrows 时需要谨慎,确保你了解可能抛出的异常,并且调用者能够适当地处理这些异常。@SneakyThrows public void fun1(int testCode){ if (testCode == 1){ throw new CheckException(); } }
- 在方法签名中使用throws关键字。也就是把错误抛到更外一级,让外级再处理
public void fun1(int testCode) throws CheckException { if (testCode == 1){ throw new CheckException(); } }
二.非检查型异常
非检查型异常也就是RuntimeException及其子类的异常。这类异常不需要编译(也就是写代码是)时强制校验,如 int i = 1/0,空指针异常等,由于这些异常是允许我们在代码中写且可以编译通过的,只有运行到此处时才会报错,我写程序调试的过程中都经常使用int i = 1/0去模拟和调试一些情况。
如下我们定义了一个非检查型的异常,当我们调用它时译前不做任何处理也不会被标红。
public class UncheckException extends RuntimeException {
private String errorCode;
}