Как определить собственный класс исключений в Java, самый простой способ?

Я пытаюсь определить свой собственный класс исключений самым простым способом, и это то, что я получаю:

public class MyException extends Exception {}

public class Foo {
  public bar() throws MyException {
    throw new MyException("try again please");
  }
}

Это то, что говорит компилятор Java:

cannot find symbol: constructor MyException(java.lang.String)

У меня было ощущение, что этот конструктор должен быть унаследован от java.lang.Exception, не так ли?

Ответ 1

Нет, вы не наследуете конструкторы, не являющиеся стандартными, вам нужно определить тот, который принимает строку в вашем классе. Обычно вы используете super(message) в своем конструкторе для вызова своего родительского конструктора. Например, например:

public class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}

Ответ 2

Типичное пользовательское исключение, которое я бы определил, выглядит примерно так:

public class CustomException extends Exception {

    public CustomException(String message) {
        super(message);
    }

    public CustomException(String message, Throwable throwable) {
        super(message, throwable);
    }

}

Я даже создаю шаблон с помощью Eclipse, поэтому мне не нужно писать все это снова и снова.

Ответ 3

Если вы используете диалог нового класса в Eclipse, вы можете просто установить для поля Superclass значение java.lang.Exception и проверить "Конструкторы из суперкласса" и он будет генерировать следующее:

package com.example.exception;

public class MyException extends Exception {

    public MyException() {
        // TODO Auto-generated constructor stub
    }

    public MyException(String message) {
        super(message);
        // TODO Auto-generated constructor stub
    }

    public MyException(Throwable cause) {
        super(cause);
        // TODO Auto-generated constructor stub
    }

    public MyException(String message, Throwable cause) {
        super(message, cause);
        // TODO Auto-generated constructor stub
    }

}

В ответ на вопрос ниже о том, что не вызывал super() в конструкторе defualt, Oracle это сказать:

Примечание. Если конструктор явно не вызывает конструктор суперкласса, компилятор Java автоматически вставляет вызов конструктору без аргументов суперкласса.

Ответ 4

Причина этого объясняется в статье Наследование платформы Java, которая гласит:

"Подкласс наследует все члены (поля, методы и вложенные классы) из своего суперкласса. Конструкторы не являются членами, поэтому они не наследуются подклассами, но конструктор суперкласса может быть вызван из подкласса."

Ответ 5

package customExceptions;

public class MyException extends Exception{

    public MyException(String exc)
    {
        super(exc);
    }
    public String getMessage()
    {
        return super.getMessage();
    }
}

import customExceptions.MyException;

public class UseCustomException {

    MyException newExc=new MyException("This is a custom exception");

    public UseCustomException() throws MyException
    {
        System.out.println("Hello Back Again with custom exception");
        throw newExc;       
}

    public static void main(String args[])
    {
        try
        {
            UseCustomException use=new UseCustomException();
        }
        catch(MyException myEx)
        {
            System.out.println("This is my custom exception:" + myEx.getMessage());
        }
    }
}

Ответ 6

Класс исключений имеет два конструктора

  • public Exception() - Это создает исключение без какой-либо дополнительной информации. Обычно исключение обычно выводится из имени класса.
  • public Exception(String s) - создает исключение с указанным сообщением об ошибке. Подробное сообщение представляет собой строку, которая описывает условие ошибки для этого конкретного исключения.

Ответ 7

Если вы наследуете от Exception, вы должны предоставить конструктор, который принимает параметр String в качестве параметра (он будет содержать сообщение об ошибке).