Как определить пользовательский класс исключений в 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, не так ли?

565   7  

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

    Ничего не найдено.