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