Migliore comprensione su Checked vs. Eccezioni non controllate: come gestire le eccezioni in modo migliore in Java?
Pubblicato: 2014-09-15Eccezione controllata
Che cos'è l'eccezione verificata nel linguaggio di programmazione Java. In un linguaggio semplice: Eccezione che viene verificata in fase di compilazione denominata Eccezione verificata. Alcuni di questi sono menzionati di seguito. Se nel tuo codice se alcuni dei metodi generano checked exception
, quindi il metodo deve handle the exception
o deve specificare l'eccezione utilizzando la parola chiave throws
.
- IOException
- SQLException
- DataAccessException
- ClassNotFoundException
- InvocationTargetException
- MalformedURLException
Diamo un'occhiata all'esempio:
Nell'esempio seguente otterremo i contenuti del sito "Crunchify.com" e lo stamperemo nella console. Durante questa operazione, il programma Java genererà MalformedURLException
o IOException
nelle righe sotto evidenziate.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package com . crunchify . tutorial ; import java . io . BufferedReader ; import java . io . InputStreamReader ; import java . net . URL ; import java . net . URLConnection ; import java . nio . charset . Charset ; /** * @author Crunchify.com * */ public class CrunchifyCheckedException { public static void main ( String [ ] args ) { System . out . println ( "\nOutput: \n" + callCrunchifyURL ( "https://crunchify.com" ) ) ; } public static String callCrunchifyURL ( String myURL ) { System . out . println ( "Requested URL:" + myURL ) ; StringBuilder sb = new StringBuilder ( ) ; URLConnection urlConn = null ; InputStreamReader in = null ; URL url = new URL ( myURL ) ; urlConn = url . openConnection ( ) ; if ( urlConn ! = null ) urlConn . setReadTimeout ( 60 * 1000 ) ; if ( urlConn ! = null && urlConn.getInputStream() != null) { in = new InputStreamReader(urlConn.getInputStream(), Charset.defaultCharset()); BufferedReader bufferedReader = new BufferedReader ( in ) ; if ( bufferedReader ! = null ) { int cp ; while ( ( cp = bufferedReader . read ( ) ) ! = - 1 ) { sb . append ( ( char ) cp ) ; } bufferedReader . close ( ) ; } } in . close ( ) ; return sb . toString ( ) ; } } |
Ci sono due modi per risolvere questo problema. Add throws clause
OPPURE Add Try, Catch block
al tuo codice per risolverlo. Ecco un codice aggiornato.
- Modifica le righe 16 e 20 e aggiunge
throws IOException
- Aggiungi try catch block su 26,42,43
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
package com . crunchify . tutorial ; import java . io . BufferedReader ; import java . io . IOException ; import java . io . InputStreamReader ; import java . net . URL ; import java . net . URLConnection ; import java . nio . charset . Charset ; /** * @author Crunchify.com * */ public class CrunchifyCheckedException { public static void main ( String [ ] args ) throws IOException { System . out . println ( "\nOutput: \n" + callCrunchifyURL ( "https://crunchify.com" ) ) ; } public static String callCrunchifyURL ( String myURL ) throws IOException { System . out . println ( "Requested URL:" + myURL ) ; StringBuilder sb = new StringBuilder ( ) ; URLConnection urlConn = null ; InputStreamReader in = null ; try { URL url = new URL ( myURL ) ; urlConn = url . openConnection ( ) ; if ( urlConn ! = null ) urlConn . setReadTimeout ( 60 * 1000 ) ; if ( urlConn ! = null && urlConn.getInputStream() != null) { in = new InputStreamReader(urlConn.getInputStream(), Charset.defaultCharset()); BufferedReader bufferedReader = new BufferedReader ( in ) ; if ( bufferedReader ! = null ) { int cp ; while ( ( cp = bufferedReader . read ( ) ) ! = - 1 ) { sb . append ( ( char ) cp ) ; } bufferedReader . close ( ) ; } } } catch ( IOException e ) { // TODO: Consume and Throw an error with detailed message. } in . close ( ) ; return sb . toString ( ) ; } } |

Eccezione non selezionata
Le eccezioni deselezionate in Java sono quelle eccezioni la cui gestione NOT verified during Compile time
. Queste eccezioni si verificano a causa di una cattiva programmazione.
Il programma non darà un errore di compilazione.
Tutte le eccezioni Unchecked sono sottoclassi dirette della classe RuntimeException
.
Simple Example
: hai creato un modulo online che accetta l'input dell'utente. È un modulo di testo libero. L'uso può inserire qualsiasi valore errato in caso di campo e-mail o campo nome utente O campo numero di telefono.
Se non si dispone della convalida lato client, ci sono più possibilità di ottenere l'eccezione di convalida di runtime durante l'esecuzione dell'applicazione in produzione. L'errore può essere generato dall'operazione DB o dalla conversione del campo da un formato all'altro.
Di seguito sono riportati i tipi di eccezioni non selezionate:
- NullPointerException
- ArrayIndex OutOfBound
- IllegalArgumentException
- IllegalStateException
Quello che più mi infastidisce è NullPointer Exception. Ho scritto un articolo dettagliato su NPE la scorsa settimana.
Ci sono in totale 8 diversi suggerimenti forniti per evitare NPE.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com . crunchify . tutorial ; /** * @author Crunchify.com */ public class CrunchifyUncheckedException { public static void main ( String args [ ] ) { String crunchifyArr [ ] = { "Crunchify" , "Google" , "Yahoo" , "Amazon" , "eBay" } ; String myString = crunchifyArr [ 7 ] ; // This throws ArrayIndexOutOfBoundException System . out . println ( myString ) ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package com . crunchify . tutorial ; /** * @author Crunchify.com */ public class CrunchifyUncheckedException { public static void main ( String args [ ] ) { String crunchifyArr [ ] = { "Crunchify" , "Google" , "Yahoo" , "Amazon" , "eBay" } ; try { String myString = crunchifyArr [ 7 ] ; // This throws ArrayIndexOutOfBoundException System . out . println ( myString ) ; } catch ( ArrayIndexOutOfBoundsException e ) { System . out . println ( "ArrayIndexOutOfBoundException appears here. Better handle it in code above :)" + e ) ; } } } |
In Java 7, puoi gestire più eccezioni in un singolo Catch block
. È possibile modificare la riga 13 dalla riga sopra modificata alla riga inferiore.
1 |
} catch ( ArrayIndexOutOfBoundsException | NumberFormatException e ) { |
In sintesi, sia l'eccezione verificata che quella non verificata vengono gestite utilizzando la parola chiave try, catch
e finally
.
In termini di funzionalità verificata e eccezione non verificata sono gli stessi.