Mejor comprensión en Checked vs. Excepciones no verificadas: ¿cómo manejar las excepciones de una mejor manera en Java?
Publicado: 2014-09-15Excepción marcada
¿Qué es la excepción marcada en el lenguaje de programación Java? En lenguaje simple: Excepción que se verifica en el momento de la compilación llamada Excepción comprobada. Algunos de estos se mencionan a continuación. Si en su código, si algún método arroja una checked exception
, entonces el método debe handle the exception
o debe especificar la excepción usando la palabra clave throws
.
- IOException
- SQLException
- Excepción de acceso a datos
- ClassNotFoundException
- Excepción de invocación de objetivos
- MalformedURLException
Echemos un vistazo al ejemplo:
En el siguiente ejemplo, vamos a obtener el contenido del sitio "Crunchify.com" e imprimirlo en la consola. Durante esta operación, el programa Java generará MalformedURLException
o IOException
en las líneas resaltadas a continuación.
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 ( ) ; } } |
Hay dos formas de resolver esto. Add throws clause
O Add Try, Catch block
a su código para resolverlo. Aquí hay un código actualizado.
- Modifica las líneas 16 y 20 y agrega
throws IOException
- Agregue el bloque try catch en 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 ( ) ; } } |

Excepción no verificada
La excepción no verificada en Java son aquellas excepciones cuyo manejo NOT verified during Compile time
. Estas excepciones ocurren debido a una mala programación.
El programa no dará un error de compilación.
Todas las excepciones no verificadas son subclases directas de la clase RuntimeException
.
Simple Example
: ha creado un formulario en línea que acepta la entrada del usuario. Es un formulario de texto libre. El usuario puede ingresar cualquier valor incorrecto en el caso del campo de correo electrónico, el campo de nombre de usuario O el campo de número de teléfono.
Si no tiene validación en el lado del cliente, hay más posibilidades de obtener una Excepción de validación en tiempo de ejecución mientras ejecuta la aplicación en producción. El error puede arrojarse por la operación de la base de datos o la conversión del campo de un formato a otro.
A continuación se muestran tipos de excepciones no verificadas:
- Excepción de puntero nulo
- ArrayIndexOutOfBound
- Argumento de excepción ilegal
- IllegalStateExceptionIlegalStateException
El que más me molesta es NullPointer Exception. Escribí un artículo detallado sobre NPE la semana pasada.
Hay un total de 8 consejos diferentes proporcionados para evitar 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 ) ; } } } |
En Java 7, podría manejar múltiples excepciones en un solo Catch block
. Puede cambiar la línea 13 de arriba a abajo.
1 |
} catch ( ArrayIndexOutOfBoundsException | NumberFormatException e ) { |
Como resumen, tanto la excepción marcada como la no marcada se manejan usando las palabras clave try, catch
y finally
.
En términos de funcionalidad, las excepciones marcadas y no marcadas son las mismas.