L'articolo descrive le 10 domande più frequenti sulle eccezioni in Java.
1. Verificabile e non verificabile
In breve, le eccezioni controllate devono essere catturate esplicitamente nel corpo del metodo o dichiarate nella sezione Throws del metodo. Le eccezioni non controllate sono causate da problemi che non possono essere risolti, come la divisione per 0, il puntatore nullo, ecc. Le eccezioni selezionate sono particolarmente importanti perché ti aspetti che altri sviluppatori che utilizzano la tua API sappiano come gestire le eccezioni. Ad esempio, IOException è un'eccezione controllata comunemente utilizzata, mentre RuntimeException è un'eccezione non controllata. Prima di leggere oltre, controlla
il diagramma delle eccezioni gerarchiche in Java .
2. Il modo migliore per gestire le eccezioni
Se l'eccezione può essere gestita correttamente, deve essere catturata, altrimenti deve essere inoltrata.
3. Perché le variabili definite in try non possono essere utilizzate in catch o infine?
Nella seguente parte di codice, la riga dichiarata in un blocco try non può essere utilizzata in un blocco catch. Questo codice non verrà compilato.
try {
File file = new File("path");
FileInputStream fis = new FileInputStream(file);
String s = "inside";
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println(s);
}
Il motivo è che non è noto in quale punto del blocco try potrebbe essere stata lanciata l'eccezione. È possibile che l'eccezione sia stata lanciata prima che l'oggetto fosse dichiarato. E questo è vero per questo esempio.
4. Perché Double.parseDouble(null) e Integer.parseInt(null) lanciano eccezioni diverse?
Esatto, sollevano diverse eccezioni. Questo è un problema di JDK. Sono stati semplicemente progettati da persone diverse e non dovresti preoccuparti troppo di questo.
Integer.parseInt(null);
Double.parseDouble(null);
5. Eccezioni di runtime di base in Java
Eccone alcuni:
IllegalArgumentException
ArrayIndexOutOfBoundsException
Possono essere utilizzati in un'istruzione if quando la condizione non è soddisfatta, come qui:
if (obj == null) {
throw new IllegalArgumentException("obj не может быть равно null");
6. È possibile catturare più eccezioni in un unico blocco catch?
La risposta è si. Finché le classi di queste eccezioni possono essere ricondotte nella gerarchia di ereditarietà delle classi fino alla stessa superclasse, è possibile utilizzare solo quella superclasse.
7. Un costruttore può lanciare eccezioni?
La risposta è si. Un costruttore è solo un tipo speciale di metodo.
Ecco un esempio di codice.
8. Lanciare eccezioni nel blocco finale
In linea di principio, puoi farlo legalmente:
public static void main(String[] args) {
File file1 = new File("path1");
File file2 = new File("path2");
try {
FileInputStream fis = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
FileInputStream fis = new FileInputStream(file2);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
Ma per mantenere la leggibilità del codice, è necessario dichiarare il blocco nidificato
try-catch
come un nuovo metodo e inserire una chiamata a questo metodo nel blocco
finally
.
public static void main(String[] args) {
File file1 = new File("path1");
File file2 = new File("path2");
try {
FileInputStream fis = new FileInputStream(file1);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
methodThrowException();
}
}
9. È possibile utilizzare return in un blocco final?
Si, puoi.
10. Perché gli sviluppatori gestiscono le eccezioni in silenzio?
Ad esempio, tali pezzi di codice compaiono spesso. Se la corretta gestione delle eccezioni è così importante, perché gli sviluppatori continuano a scriverla in questo modo?
try {
...
} catch(Exception e) {
e.printStackTrace();
}
È più facile da ignorare. Ma anche se questo viene fatto spesso, non significa che sia corretto. Collegamenti:
- Eccezioni non controllate in Java
- La radice di un albero gerarchico delle eccezioni in Java
- Domande sulle eccezioni su StackOverflow
Articolo originale
GO TO FULL VERSION