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?
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);
}
}
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.
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.
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
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());
}
}
}
A classe de exceção tem dois construtores
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.