Como definir a classe de exceção personalizada em Java, a maneira mais fácil?

I'estou tentando definir minha própria classe de exceção da maneira mais fácil, e isto é o que eu'estou conseguindo:

public class MyException extends Exception {}

public class Foo {
  public bar() throws MyException {
    throw new MyException("try again please");
  }
}

Isto é o que diz o compilador Java:

cannot find symbol: constructor MyException(java.lang.String)

Eu tinha a sensação de que este construtor tem que ser herdado de java.lang.Exception, não é't it?

Solução

Não, você não't "inherit" construtores não faltosos, você precisa definir aquele que toma uma String na sua classe. Tipicamente você utiliza super(message) no seu construtor para invocar o seu construtor pai. Por exemplo, como este:

public class MyException extends Exception {
    public MyException(String message) {
        super(message);
    }
}
Comentários (10)

Uma típica exceção personalizada I'd definir é algo parecido com isto:

public class CustomException extends Exception {

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

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

}

Eu até crio um template usando o Eclipse para não'não ter que escrever tudo uma e outra vez.

Comentários (1)

Se você utilizar o novo diálogo de classe no Eclipse você pode apenas definir o campo Superclass para `java.lang.Exception' e verificar "Construtores de superclass" e ele irá gerar o seguinte:

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
    }

}

Em resposta à pergunta abaixo sobre não chamar super() no construtor defunto, a Oracle tem isto para dizer:

Note: Se um construtor não invocar explicitamente um construtor de superclasse, o compilador Java insere automaticamente uma chamada para o construtor sem argumentos da superclasse.

Comentários (2)

A razão disto é explicada no artigo [**Inheritance***][1] da Plataforma Java que diz:

"Uma subclasse herda todos os membros (campos, métodos, e aninhados

classes) da sua superclasse. Os construtores não são membros, por isso eles

não são herdados por subclasses, mas o construtor da superclasse

pode ser invocada a partir da subclasse."

[1]: http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

Comentários (0)
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());
        }
    }
}
Comentários (2)

A classe de exceção tem dois construtores

  • Exceção pública()`` -- Isto constrói uma Exceção sem qualquer informação adicional. A natureza da exceção é tipicamente inferida a partir do nome da classe.
  • Exception(String s)public Exception() -- Constrói uma exceção com uma mensagem de erro especificada. Uma mensagem detalhada é uma String que descreve a condição de erro para esta exceção em particular.
Comentários (2)

Se você herdar da Exceção, você tem que fornecer um construtor que toma uma String como parâmetro (ele irá conter a mensagem de erro).

Comentários (2)