我正在学习java中的功能,包括异常。我正在编写自定义异常。这是我正在做的:自定义异常类:
public class ServiceException extends Exception {
private String customMessage;
public ServiceException(String customMessage) {
super(customMessage);
this.customMessage = customMessage;
}
}
主要课程:
public class Main {
public static void main(String[] args) {
try {
new Main().test();
} catch (Exception e) {
System.out.println("the exception message is " + e.getMessage());
}
}
public void test() throws ServiceException {
try {
int i = 1 / 0;
} catch (Exception e) {
throw new ServiceException(e.getMessage());
}
}
}
我知道这个: 如果未在自定义异常类中调用超类构造函数,则自定义异常中设置的消息不会传递给Exception类。但是如果我在自定义异常类中有一个方法 public String getMessage ,即使没有调用super,也会打印该消息。对不起,如果这是一个天真的问题。但我没有理解他的概念。可以来帮助清除这个概念吗?
答案 0 :(得分:0)
那是因为你提供它。您将e.getMessage()
作为唯一参数customMessage传递给构造函数。然后,您将customMessage
传递给其String
,Exception(String)
的父级构造函数。在这样做时,您将为其提供用于serviceExceptionInstance.getMessage()
的消息。相反,不要将customMessage
传递给它的父项(使用super();
,如果没有给出对父构造函数的调用并且存在no-arg,父构造函数,则暗示这是隐含的。然后消息将为null
,因为它未提供。
换句话说:
new ServiceException(e.getMessage());
使用ServiceException
的消息创建新的e
。您将该邮件传递给Exception
,ServiceException
的父级。
super(customMessage);
这样做时,您使用String
的单个参数Exception
- 构造函数。将值传递给该构造函数意味着您希望在调用者调用getMessage
时使用它。为了避免这样做,请调用另一个父构造函数,或者根本不调用(从技术上讲,调用none是不可能的,并且它将隐式地为您执行super();
):
public ServiceException(String customMessage)
{
this.customMessage = customMessage;
}
这将为您调用super();
,这意味着父类没有要发送的消息,而不自己覆盖getMessage()
,它将返回其默认值值(null
)。需要说明的是,Exception
本身来自Throwable
,它实际上是提供此功能的类,但这一切都源于您使用Exception
的方式,因为它作为传递来实现Throwable
。
答案 1 :(得分:0)
在捕获错误的主要部分中,您基本上将ServiceException对象分配给Exception引用,即将派生类对象分配给基类引用,因此如果派生类已重写该方法,则会调用它。 / p>
正在调用的e.message()来自ServiceException而不是Exception,你是对的,当你不调用super时没有传递数据,数据只在ServiceException类中,而且调用的函数也来自ServiceException类。 / p>