Il sistema di gestione delle eccezioni in java (exception handling) prevede la loro suddivisione in due tipologie così sintetizzabili:
- checked: esprimono eccezioni che si riferiscono a condizioni recuperabili e che quindi possono essere gestite dal metodo chiamante;
- unchecked: esprimono condizioni non recuperabili, generalmente dovute ad errori di programmazione e quindi non gestibili dal metodo chiamante.
Esempio di eccezioni java del primo tipo sono IOException
e FileNotFoundException
. Il client è in grado di gestirli ad esempio prospettandole all’utente che può quindi intervenire. Per creare una eccezione di questo tipo è necessario estendere java.lang.Exception
.
1 2 3 4 5 |
public class UserNotFoundException extends Exception { public UserNotFoundException(String message) { super(message); } } |
Per questo tipo di eccezioni il compilatore richiede la loro gestione o attraverso l’utilizzo di un blocco try...catch
oppure differendo la gestione al metodo chiamante attraverso la clausola trows
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class UserService { public User findUser(String username) throws UserNotFoundException { if ( "".equals( username ) ) { throw new UserNotFoundException("User does not exists!"); } return new User( username ); } public static void main(String[] args) { UserService service = new UserService(); try { User user = service.findByName(""); } catch (UserNotFoundException e) { e.printStackTrace(); } } } |
Esempi di eccezioni del secondo tipo sono, invece, NullPointerException
o IndexOutOfBoundsException
. Il client non può fare nulla per gestire l’eccezione che può essere eliminata solamente programmaticamente, ad esempio testando i valori nulli prima di utilizzarli. Per creare una eccezione unchecked è necessario estendere java.lang.RuntimeException
.
1 2 3 4 5 |
public class TooManyDataException extends RuntimeException { public TooManyDataException(String message) { super(message); } } |
try...catch
è infatti opzionale.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class UserService { public void analyze(List<User> users) { if ( users.size() > 50 ) { throw new TooManyDataException("Too many users in the list"); } } public static void main(String[] args) { UserService service = new UserService(); // Create 100 users List<User> users = new ArrayList<>( Collections.nCopies( 100, new User() ) ); obj.analyze(users); } } |