public class BaseException extends RuntimeException { private static final long serialVersionUID = 1L; /** * 所属模块 */ private String module; /** * 错误码 */ private String code; /** * 错误码对应的参数 */ private Object[] args; /** * 错误消息 */ private String defaultMessage; public BaseException(String module, String code, Object[] args, String defaultMessage) { this.module = module; this.code = code; this.args = args; this.defaultMessage = defaultMessage; } public BaseException(String module, String code, Object[] args) { this(module, code, args, null); } public BaseException(String module, String defaultMessage) { this(module, null, null, defaultMessage); } public BaseException(String code, Object[] args) { this(null, code, args, null); } public BaseException(String defaultMessage) { this(null, null, null, defaultMessage); } @Override public String getMessage() { String message = null; if (!StringUtils.isEmpty(code)) { message = MessageUtils.message(code, args); } if (message == null) { message = defaultMessage; } return message; } public String getModule() { return module; } public String getCode() { return code; } public Object[] getArgs() { return args; } public String getDefaultMessage() { return defaultMessage; } }
在 Java 中,如果一个类的构造方法没有显式调用父类的构造方法(即 `super()`),那么会默认调用父类的无参构造方法(如果存在)。如果父类没有无参构造方法,或者想要调用父类的有参构造方法,则必须在子类的构造方法中使用 `super(参数列表)` 明确调用父类的构造方法。
在你提供的例子中,`BaseException` 继承自 `RuntimeException`,而 `RuntimeException` 有一个无参构造方法,因此在 `BaseException` 的构造方法中没有显式调用 `super()` 或 `super(参数列表)` 是合法的。
如果 `RuntimeException` 没有无参构造方法,`BaseException` 的构造方法可以使用 `super(参数列表)` 来调用父类的有参构造方法,例如:
```java
public BaseException(String module, String code, Object[] args, String defaultMessage) {
super(); // 调用父类的无参构造方法
// 子类的其他初始化逻辑
}
```
或者如果 `RuntimeException` 有有参构造方法,可以根据需要调用具体的父类构造方法:
```java
public BaseException(String module, String code, Object[] args, String defaultMessage) {
super("RuntimeException message"); // 调用父类的有参构造方法
// 子类的其他初始化逻辑
}
```
总结来说,如果父类有无参构造方法且你不需要显式调用父类的有参构造方法,那么在子类的构造方法中不需要调用 `super()`。