Come possiamo creare eccezioni personalizzate in Java?
Come possiamo creare eccezioni personalizzate in Java?
Risposte:
Per definire un'eccezione controllata , creare una sottoclasse (o gerarchia di sottoclassi) di java.lang.Exception. Per esempio:
public class FooException extends Exception {
public FooException() { super(); }
public FooException(String message) { super(message); }
public FooException(String message, Throwable cause) { super(message, cause); }
public FooException(Throwable cause) { super(cause); }
}
I metodi che possono potenzialmente generare o propagare questa eccezione devono dichiararla:
public void calculate(int i) throws FooException, IOException;
... e il codice che chiama questo metodo deve gestire o propagare questa eccezione (o entrambi):
try {
int i = 5;
myObject.calculate(5);
} catch(FooException ex) {
// Print error and terminate application.
ex.printStackTrace();
System.exit(1);
} catch(IOException ex) {
// Rethrow as FooException.
throw new FooException(ex);
}
Noterai nell'esempio sopra che IOExceptionviene catturato e riproposto come FooException. Questa è una tecnica comune utilizzata per incapsulare le eccezioni (in genere durante l'implementazione di un'API).
A volte ci saranno situazioni in cui non si desidera forzare ogni metodo a dichiarare l'implementazione dell'eccezione nella clausola dei suoi tiri. In questo caso è possibile creare un'eccezione non selezionata . Un'eccezione non selezionata è qualsiasi eccezione che si estende java.lang.RuntimeException(che a sua volta è una sottoclasse di java.lang.Exception):
public class FooRuntimeException extends RuntimeException {
...
}
I metodi possono generare o propagare FooRuntimeExceptionun'eccezione senza dichiararla; per esempio
public void calculate(int i) {
if (i < 0) {
throw new FooRuntimeException("i < 0: " + i);
}
}
Le eccezioni non selezionate vengono in genere utilizzate per indicare un errore del programmatore, ad esempio passando un argomento non valido a un metodo o tentando di violare i limiti di un indice di array.
La java.lang.Throwableclasse è la radice di tutti gli errori e le eccezioni che possono essere generati in Java. java.lang.Exceptione java.lang.Errorsono entrambe le sottoclassi di Throwable. Tutto ciò che subclasse Throwablepuò essere lanciato o catturato. Tuttavia, è in genere una cattiva pratica catturare o lanciare Errorpoiché viene utilizzato per indicare errori interni alla JVM che di solito non possono essere "gestiti" dal programmatore (ad es OutOfMemoryError.). Allo stesso modo dovresti evitare di catturare Throwable, il che potrebbe comportare la cattura di Errors oltre a Exceptions.
Per un'eccezione controllata:
public class MyCustomException extends Exception { }
Tecnicamente, tutto ciò che si estende Throwablepuò essere lanciato, ma le eccezioni sono generalmente estensioni della Exceptionclasse in modo che siano verificate eccezioni (tranne RuntimeException o classi basate su di essa, che non sono controllate), al contrario dell'altro tipo comune di gettabile, Errorche di solito non sono progettati per essere gestiti con garbo al di là degli interni JVM.
Puoi anche rendere le eccezioni non pubbliche, ma puoi usarle solo nel pacchetto che le definisce, al contrario di tutti i pacchetti.
Per quanto riguarda il lancio / la cattura di eccezioni personalizzate, funziona proprio come quelle incorporate - passa via
throw new MyCustomException()
e prendere via
catch (MyCustomException e) { }
Throwablepuò essere lanciato ; le eccezioni si estendono Exception. Una sottoclasse personalizzata di Throwable non verrebbe catturata da un try { ... } catch (Exception e) { ... }blocco.
Errornon è un'eccezione, è un errore). 3) Implica che qualsiasi sottoclasse di eccezione sia controllata mentre RuntimeException non lo è. La risposta data da Adamski è molto più accurata!