Как определить собственный класс исключений в 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 в качестве параметра (он будет содержать сообщение об ошибке).