10.6 CREACIÓN DE EXCEPCIONES PROPIAS

 

¿Qué tal? ¿Cómo van las excepciones? Espero que lo tengáis claro, ya sabéis que ante cualquier duda me lo podéis hacer llegar a través de los comentarios del blog o enviándome un mail a amizba@gmail.com.

En este post vamos a ver cómo crear nuestras propias excepciones y cómo surge la necesidad de crear nuestras propias excepciones. Vamos a seguir trabajando con la práctica del post anterior, recordamos que si le indicábamos un mail de 3 o menos caracteres se lanzaba una excepción está excepción la pusimos como tipo IOException:



De forma que nos obligaba a declarar la estructura try… catch:



Pero también lo hicimos con la clase ArrayIndexOutOfBoundsException que al heredar de la clase RuntimeException no era necesario declarar la estructura try… catch.

Tanto con IOException como ArrayIndexOutOfBoundsException el programa funcionaba correctamente, sin embargo, ninguna de las dos se adapta al error que nos da si introducimos un mail incorrecto.

IOException se utiliza para ficheros externos, por ejemplo, un programa Java se encarga de leer ficheros de texto y se supone que esos ficheros en su interior tienen que tener 10 líneas de texto uno de esos ficheros en lugar de tener 10 líneas tiene 3 líneas de texto ahí se produce una excepción de tipo IOException.

ArrayIndexOutOfBoundsException se utiliza cuando se trabajan con arrays y se produce cuando intentamos acceder a una posición de un array que no existe.

En la API de Java no existe ninguna clase que se adapte al error que da nuestra aplicación de ahí la necesidad de crear nuestras propias excepciones.

Para crear nuestras propias excepciones hay que crear una clase que herede de la clase Exception, IOException o de RuntimeException. De las dos primeras estamos obligados a declarar un bloque try… catch y de la tercera clase no estamos obligados ya que es un error no controlado.

Lo primero que vamos a hacer es comentar las líneas del bloque try… catch:



Eliminamos el throws Exception del método:

static void examina_mail (String mail) throws IOException

Y la instancia del IOException del if, vamos a dejar en blanco lo que hay dentro del if:

if(mail.length()<=3) {

                 

                  //ArrayIndexOutOfBoundsException e = new ArrayIndexOutOfBoundsException();

                 

                  throw new IOException();

Al final del código creamos nuestra propia clase que hereda de Exception:

class longitud_mail extends Exception {

     

     

}

Este tipo de clases se recomienda que tengan dos constructores, el constructor por defecto sin parámetros y otro constructor que admita un parámetro de tipo String.

class longitud_mail extends Exception {

     

      public longitud_mail() {

           

      }

     

      public longitud_mail(String msj) {

           

           

      }

     

}

Dentro del segundo constructor:

class longitud_mail extends Exception {

     

      public longitud_mail() {

           

      }

     

      public longitud_mail(String msj) {

           

            super(msj);

      }

     

}

Estamos llamando al constructor padre o el constructor de la clase Exception y le estamos pasando a ese constructor como parámetro lo que hay almacenado dentro de msj.

Ahora tenemos que ir al método examina_mail indicarle que lanza una excepción de tipo longitud_mail, es decir, de la clase que acabamos de crear.

static void examina_mail (String mail) throws longitud_mail 

Le tenemos que indicar donde lanza la excepción y es cuando indicamos que la longitud del mail es de 3 o menos caracteres así que dentro del if:

            if(mail.length()<=3) {

                 

                  //ArrayIndexOutOfBoundsException e = new ArrayIndexOutOfBoundsException();

                 

                  throw new longitud_mail();

     

            }

Lo que hace esta instrucción es llamar al constructor de la clase longitud_mail esta clase tienen dos constructores podemos utilizar el constructor por defecto o bien el constructor por parámetro, si le pasamos este último podemos indicarle un mensaje personalizado:

throw new longitud_mail("El mail no es correcto");

Si observamos el código en la llamada al método hay un error:



Ya que estamos obligados a declarar el bloque try… catch por lo que desbloqueamos las líneas comentadas en el catch el error sería de tipo Exception en lugar de IOException:

            try {

            examina_mail(el_mail);

            }catch(Exception e) {

                 

                  System.out.println("La dirección mail no es correcta");         

            }

Podríamos prescindir del mensaje de la línea de código donde lanza el error:

throw new longitud_mail("El mail no es correcto");

Probamos la aplicación indicando un mail de tres caracteres:



Al pulsar el botón Aceptar nos da el error de la excepción que hemos creado:



Imaginad que fuera un código más complejo y fuera otro programador diferente al que ha desarrollado la aplicación este error no le da muchas pistas para ver donde se ha equivocado en el mail. Para que nos dé una pista y nos dé una excepción utilizamos printStackTrace() de la siguiente forma:

catch(Exception e) {

                 

                  System.out.println("La dirección mail no es correcta");   

                 

                  e.printStackTrace();

            }

Y dentro del condicional if en la línea de código donde esta throw podemos indicarle otro mensaje:

throw new longitud_mail("Has introducido un mail de 3 o menos carácteres");

Si probamos de nuevo:



Al pulsar Aceptar:



Nos muestra el error que hay dentro del bloque catch y también una excepción de tipo longitud_mail y nos da una descripción del mismo.

Y eso ha sido todo, os espero en el próximo post. Saludos!

10.5 CLÁUSULA THROW << >> 10.7 CAPTURAS DE VARIAS EXCEPCIONES




No hay comentarios:

Publicar un comentario