Суперкласс в пользовательском исключении в java

Я изучаю функции в 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());
 }
 }
}

Об этом я знаю: если суперклассификатор класса не вызывается в настраиваемом классе исключений, то сообщение, заданное в пользовательском исключении, не передается классу исключений. Но если у меня есть метод public String getMessage в моем настраиваемом классе исключения, даже если супер не вызывается, это сообщение печатается. Извините, если это наивный вопрос. Но я не понимаю его концепции. Может ли одна помощь очистить концепцию?

2 ответа

В основном, где вы обнаруживаете ошибку, вы в основном присваиваете объекту ServiceException ссылку Исключения, то есть присваиваете объект производного класса базовому классу, поэтому, если производный класс переопределил метод, он будет вызван.

вызываемый e.message() происходит из ServiceException not Exception, вы правы, данные не передаются, когда вы не вызываете super, данные находятся внутри класса ServiceException, а вызываемая функция также относится к классу ServiceException.


Это потому, что вы его поставляете. Вы передаете e.getMessage() вашему конструктору в качестве единственного аргумента customMessage. Затем вы передаете customMessage своему родительскому конструктору, который принимает String, Exception(String). При этом вы даете ему сообщение для использования для serviceExceptionInstance.getMessage(). Вместо этого не передавайте customMessage его родительскому customMessage (используйте super(); customMessage что подразумевается, если вызов родительского конструктора не задан, и существует конструктор родительского типа no-arg). Тогда сообщение будет null поскольку оно не будет предоставлено.

Другими словами:

new ServiceException(e.getMessage());

Создает новое ServiceException с сообщением от e. Вы передаете это сообщение родительскому ServiceException Exception, ServiceException.

super(customMessage);

При этом вы используете единственный аргумент, конструктор String -based Exception. Передача значения этому конструктору подразумевает, что вы хотите, чтобы он использовался, когда вызывающие getMessage ссылаются на getMessage. Чтобы избежать этого, вызовите другой родительский конструктор или вообще ничего (вызов none технически невозможен, и он будет неявно делать super(); для вас):

public ServiceException(String customMessage)
{
 this.customMessage = customMessage;
}

Это вызовет super(); для вас, что означает, что родительский класс не имеет сообщения для отправки, и, не перегружая getMessage() самостоятельно, он вернет значение по умолчанию (null). Чтобы быть ясным, само Exception распространяется от Throwable, которое действительно является классом, обеспечивающим эту функциональность, но все это проистекает из того, как вы работаете с Exception поскольку он служит для передачи Throwable.

licensed under cc by-sa 3.0 with attribution.