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

Estou tentando definir minha própria class de exceção da maneira mais fácil, e é isso que estou recebendo:

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

Isto é o que o compilador Java diz:

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

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

Não, você não “herda” construtores não-padrão, você precisa definir o que leva uma String em sua class. Normalmente você usa super(message) em seu construtor para invocar seu construtor pai. Por exemplo, assim:

 public class MyException extends Exception { public MyException(String message) { super(message); } } 

Uma exceção personalizada típica que eu definiria é algo assim:

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

Eu até mesmo criar um modelo usando o Eclipse, então eu não tenho que escrever todas as coisas uma e outra vez.

Se você usar o novo diálogo de class no Eclipse, basta definir o campo Superclass para java.lang.Exception e marcar “Construtores da superclass” e ele 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 defualt, o Oracle tem isto a dizer :

Nota: Se um construtor não invocar explicitamente um construtor de superclass, o compilador Java inserirá automaticamente uma chamada no construtor sem argumento da superclass.

O motivo disso é explicado no artigo Herança da Plataforma Java, que diz:

“Uma subclass herda todos os membros (campos, methods e classs aninhadas) de sua superclass. Construtores não são membros , então eles não são herdados por subclasss, mas o construtor da superclass pode ser invocado a partir da subclass.”

 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 class de exceção tem dois construtores

  • public Exception() – Isto constrói uma Exception sem qualquer informação adicional. A natureza da exceção é tipicamente inferida do nome da class.
  • public Exception(String s) – Constrói uma exceção com mensagem de erro especificada. Uma mensagem de detalhe é uma String que descreve a condição de erro para essa exceção específica.

Se você herdar de Exception, precisará fornecer um construtor que tenha uma String como parâmetro (ela conterá a mensagem de erro).