项目中,有些情况下需要抛出特定的异常来进行提示,这时就需要我们自己来自定义异常来使用。
1. throw跟throws关键字
- throws关键字
用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁。- 用在方法声明后面,跟的是异常类名
- 可以跟多个异常类名,用逗号隔开
- 表示抛出异常,由该方法的调用者来处理
- throws表示出现异常的一种可能性,并不一定会发生这些异常
- throw关键字
用来抛出一个具体的异常类型- 用在方法体内,跟的是异常对象名
- 只能抛出一个异常对象名
- 表示抛出异常,由方法体内的语句处理
- throw则是抛出了异常,执行throw则一定抛出了某种异常
2. RuntimeException和Exception
- java将所有的错误封装为一个对象,其根本父类为Throwable, Throwable有两个子类:Error和Exception。
- Error是Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然 ThreadDeath 错误是一个“正规”的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它。在执行该方法期间,无需在其 throws 子句中声明可能抛出但是未能捕获的 Error的任何子类,因为这些错误可能是再也不会发生的异常条件。
- Exception类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。
- RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的RuntimeException 的任何子类都无需在 throws 子句中进行声明。它是Exception的子类。
- 非RuntimeException必要自己写catch块处理掉。如果不处理,程序将出现编译错误。API中写了throws的Exception都不是RuntimeException。
- RuntimeException不用try catch捕捉将会导致程序运行中断,若用try catch捕捉则不会中断。一般情况下。对于RuntimeException的子类最好也使用异常处理机制。虽然RuntimeException的异常可以不使用try...catch进行处理,但是如果一旦发生异常,则肯定会导致程序中断执行,所以,为了保证程序再出错后依然可以执行,在开发代码时最好使用try...catch的异常处理机制进行处理。
image.png
- 常见的RuntimeException
- NullPointerException -- 空指针异常:见的最多了,一般都是在null对象上调用方法出现;
- NumberFormatException -- 数字格式化异常:继承IllegalArgumentException,字符串转换为数字时出现;
- ArrayIndexOutOfBoundsException -- 数组越界异常;
- StringIndexOutOfBoundsExceptio -- 字符串越界异常;
- ClassCastException -- 类型转换错误;
- IllegalArgumentException -- 非法参数;
3. 自定义异常
- 继承Throwable
- 继承Exception
- 继承RuntimeException
我一般是继承RuntimeException,捕获到以后抛给全局异常或者response返回。
import lombok.Getter;
import lombok.Setter;
public class MyArgumentException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
* 请求的参数数据,若参数校验不通过,此字段存储请求参数,返回前端
*/
@Getter
@Setter
private Object paramData;
public MyArgumentException() {
super();
}
public MyArgumentException(String message) {
super(message);
}
public MyArgumentException(String message, Object paramData) {
super(message);
this.paramData = paramData;
}
public MyArgumentException(String message, Throwable cause) {
super(message, cause);
}
public MyArgumentException(Throwable cause) {
super(cause);
}
}
在业务中将此异常抛给全局异常。










网友评论