Come definire una class di eccezioni personalizzata in Java, il modo più semplice?

Sto cercando di definire la mia class di eccezioni nel modo più semplice, e questo è quello che sto ottenendo:

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

Questo è ciò che dice il compilatore Java:

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

Ho avuto la sensazione che questo costruttore debba essere ereditato da java.lang.Exception , non è vero?

No, non si “ereditano” costruttori non predefiniti, è necessario definire quello che prende una stringa nella class. In genere si utilizza super(message) nel costruttore per richiamare il costruttore genitore. Ad esempio, in questo modo:

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

Una tipica eccezione personalizzata che definirei è qualcosa del genere:

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

Creo persino un modello utilizzando Eclipse, quindi non devo scrivere più e più volte.

Se usi la nuova finestra di dialogo di class in Eclipse puoi semplicemente impostare il campo Superclass su java.lang.Exception e selezionare “Costruttori da superclass” e genererà quanto segue:

 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 } } 

In risposta alla domanda di non chiamare super() nel costruttore defualt, Oracle ha questo da dire :

Nota: se un costruttore non richiama esplicitamente un costruttore di superclass, il compilatore Java inserisce automaticamente una chiamata al costruttore no-argument della superclass.

La ragione di ciò è spiegata nell’articolo sull’ereditarietà della piattaforma Java che dice:

“Una sottoclass eredita tutti i membri (campi, metodi e classi nidificate) dalla sua superclass.I costruttori non sono membri , quindi non sono ereditati da sottoclassi, ma il costruttore della superclass può essere invocato dalla sottoclass.”

 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()); } } } 

La class Exception ha due costruttori

  • public Exception() – Questo costruisce un’eccezione senza alcuna informazione aggiuntiva. La natura dell’eccezione viene generalmente dedotta dal nome della class.
  • public Exception(String s) – Crea un’eccezione con un messaggio di errore specificato. Un messaggio di dettaglio è una stringa che descrive la condizione di errore per questa particolare eccezione.

Se si eredita da Exception, è necessario fornire un costruttore che accetta una stringa come parametro (conterrà il messaggio di errore).