In questo tutorial, impareremo a usare la parola chiave throw e throws per la gestione delle eccezioni con l'aiuto di esempi.
In Java, le eccezioni possono essere classificate in due tipi:
- Eccezioni unchecked: Essi non vengono controllati al momento della compilazione, ma a run-tempo.Per esempio
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, eccezioni sottoError
di classe, ecc - Eccezioni verificate: vengono verificate in fase di compilazione. Ad esempio,
IOException
,InterruptedException
, etc.
Fare riferimento a Eccezioni Java per informazioni dettagliate sulle eccezioni selezionate e non selezionate.
Di solito, non è necessario gestire eccezioni non controllate. È perché si verificano eccezioni non controllate a causa di errori di programmazione. Ed è una buona pratica correggerli invece di gestirli.
Questo tutorial si concentrerà ora su come gestire le eccezioni verificate utilizzando throw
e throws
.
Java lancia la parola chiave
Usiamo la throws
parola chiave nella dichiarazione del metodo per dichiarare il tipo di eccezioni che potrebbero verificarsi al suo interno.
La sua sintassi è:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Come puoi vedere dalla sintassi sopra, possiamo usare throws
per dichiarare più eccezioni.
Esempio 1: Java genera Keyword
import java.io.*; class Main ( public static void findFile() throws IOException ( // code that may produce IOException File newFile=new File("test.txt"); FileInputStream stream=new FileInputStream(newFile); ) public static void main(String() args) ( try( findFile(); ) catch(IOException e)( System.out.println(e); ) ) )
Produzione
java.io.FileNotFoundException: test.txt (nessun file o directory di questo tipo)
Quando eseguiamo questo programma, se il file test.txt
non esiste, FileInputStream
lancia un FileNotFoundException
che estende la IOException
classe.
Se un metodo non gestisce le eccezioni, il tipo di eccezioni che possono verificarsi al suo interno deve essere specificato nella throws
clausola in modo che i metodi più in alto nello stack di chiamate possano gestirle o specificarle utilizzando la throws
parola chiave stessa.
Il findFile()
metodo specifica che IOException
può essere lanciato un. Il main()
metodo chiama questo metodo e gestisce l'eccezione se viene lanciata.
Lanciare più eccezioni
Ecco come possiamo generare più eccezioni utilizzando la throws
parola chiave.
import java.io.*; class Main ( public static void findFile() throws NullPointerException, IOException, InvalidClassException ( // code that may produce NullPointerException… … … // code that may produce IOException… … … // code that may produce InvalidClassException… … … ) public static void main(String() args) ( try( findFile(); ) catch(IOException e1)( System.out.println(e1.getMessage()); ) catch(InvalidClassException e2)( System.out.println(e2.getMessage()); ) ) )
Qui, il findFile()
metodo di specifica che può gettare NullPointerException
, IOException
e InvalidClassException
nella sua throws
clausola.
Nota che non abbiamo gestito il file NullPointerException
. Questo perché si tratta di un'eccezione non controllata. Non è necessario specificarlo nella throws
clausola e gestirlo.
lancia la parola chiave vs. prova … cattura … finalmente
Potrebbero esserci diversi metodi che possono causare eccezioni. Scrivere try… catch
per ogni metodo sarà noioso e il codice diventerà lungo e meno leggibile.
throws
è utile anche quando hai controllato un'eccezione (un'eccezione che deve essere gestita) che non vuoi catturare nel tuo metodo corrente.
Parola chiave Java throw
La throw
parola chiave viene utilizzata per generare in modo esplicito una singola eccezione.
Quando viene generata un'eccezione, il flusso di esecuzione del programma viene trasferito dal try
blocco al catch
blocco. Usiamo la throw
parola chiave all'interno di un metodo.
La sua sintassi è:
throw throwableObject;
Un oggetto lanciabile è un'istanza di classe Throwable
o sottoclasse della Throwable
classe.
Esempio 2: parola chiave lancio Java
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Produzione
Eccezione nel thread "main" java.lang.ArithmeticException: tentativo di dividere per 0 in Main.divideByZero (Main.java:3) in Main.main (Main.java:7) exit status 1
In questo esempio, lanciamo esplicitamente un file ArithmeticException.
Nota: ArithmeticException
è un'eccezione non controllata. Di solito non è necessario gestire le eccezioni non controllate.
Esempio 3: lancio di un'eccezione controllata
import java.io.*; class Main ( public static void findFile() throws IOException ( throw new IOException("File not found"); ) public static void main(String() args) ( try ( findFile(); System.out.println("Rest of code in try block"); ) catch (IOException e) ( System.out.println(e.getMessage()); ) ) )
Produzione
File non trovato
Il findFile()
metodo genera un IOException
con il messaggio che abbiamo passato al suo costruttore.
Si noti che poiché si tratta di un'eccezione controllata, è necessario specificarla nella throws
clausola.
I metodi che chiamano questo findFile()
metodo devono gestire questa eccezione o specificarla utilizzando la throws
parola chiave stessa.
Abbiamo gestito questa eccezione nel main
()
metodo. Il flusso di esecuzione del programma viene trasferito dal try
blocco al catch
blocco quando viene generata un'eccezione. Quindi, il resto del codice nel try
blocco viene saltato e le istruzioni nel catch
blocco vengono eseguite.