Permettetemi di aggiungere una cosa
public static MioMetodo() throws StringIndexOutOfBoundsException, NullPointerException
è un errore a livello concettuale.
StringIndexOutOfBoundException e NullPointerException sono due eccezioni eredi di RuntimeException e in quanto tali sono definite "unchecked", per cui non dovrebbero essere inserite nella clausola throws.
MioMetodo() dovrebbe fare di tutto per non sollevare queste eccezioni, e se le solleva c'è qualcosa che non va.
Ci sono dei casi in cui un metodo potrebbe sollevare delle eccezioni unchecked ma solo in risposta a dei dati in input che arrivano a runtime. In questo caso è responsabilità del chiamante fare in modo che il metodo non sollevi l'eccezione.
Ad esempio
public static int lunghezza(String s) {
return s.length();
}
Questo metodo solleva NullPointerException se la stringa passata come parametro è null.
In questo caso ci sono due strade da poter seguire:
1) Documenti il metodo informando l'utente che il metodo potrebbe sollevare una NullPointerException, così:
/**Restituisce il numero di caratteri di cui è composta la stringa specificata dal parametro.
*Lancia l'eccezione NullPointerException se la stringa è null*/
public static int lunghezza(String s) {...}
2)Gestisci i casi anomali e sollevi un'altro tipo di eccezione:
public static int lunghezza(String s) {
if(s==null) throw new IllegalArgumentException("La stringa passata in ingresso non deve essere null");
//IllegalArgumentException è un'altra eccezione unchecked
return s.length();
}
Inoltre le eccezioni unchecked, laddove possibile, non dovrebbero essere gestite nel blocco catch ma dovrebbero essere usati dei semplici controlli (prevenire è meglio che curare).
Nell'ultimo esempio che ho fatto, ho scritto
if(s==null) //gestisco il caso che può portare alla NullPointerException
che è molto meglio (leggibile, efficiente, performante) che scrivere
try {
return s.length();
}
catch(NullPointerException e) { throw new IllegalArgumentException();