Как определить пользовательский класс исключений в 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, не так ли?
7 ответов:
нет, вы не" наследуете " нестандартные конструкторы, вам нужно определить тот, который принимает строку в вашем классе. Обычно вы используете
super(message)в конструкторе для вызова родительского конструктора. Например, вот так:public class MyException extends Exception { public MyException(String message) { super(message); } }
типичное пользовательское исключение, которое я бы определил, выглядит примерно так:
public class CustomException extends Exception { public CustomException(String message) { super(message); } public CustomException(String message, Throwable throwable) { super(message, throwable); } }Я даже создаю шаблон с помощью Eclipse, поэтому мне не нужно писать все это снова и снова.
Если вы используете новый диалог класса в Eclipse, вы можете просто установить поле суперкласса в
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 автоматически вставляет вызов конструктора без аргументов суперкласса.
причина этого объясняется в наследование статья платформы Java, которая говорит:
"подкласс наследует все члены (поля, методы и вложенные классы) из своего суперкласса. конструкторы не являются членами, поэтому они наследуются не подклассами, а конструктором суперкласса может быть вызван из подкласса."
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()); } } }
класс исключений имеет два конструктора
public Exception()-- Это создает исключение без какой-либо дополнительной информации.Характер исключения обычно выводится из имени класса.public Exception(String s)-- создает исключение с указанным сообщением об ошибке.Подробное сообщение-это строка, описывающая условие ошибки для данного конкретного исключения.
Если вы наследовать от exception, вы должны предоставить конструктор, который принимает строку в качестве параметра (он будет содержать сообщение об ошибке).
Comments