Как определить пользовательский класс исключений в Java, самый простой способ? - PullRequest
276 голосов
/ 23 сентября 2010

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

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 ]

393 голосов
/ 23 сентября 2010

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

public class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}
90 голосов
/ 23 сентября 2010

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

public class CustomException extends Exception {

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

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

}

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

58 голосов
/ 28 июня 2014

Если вы используете диалоговое окно нового класса в 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 автоматически вставляет вызов в конструктор суперкласса без аргументов.

22 голосов
/ 19 ноября 2012

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

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

19 голосов
/ 19 февраля 2013
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());
        }
    }
}
2 голосов
/ 19 февраля 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...