10.5 CLÁUSULA THROW

 

Hola de nuevo, seguimos con las excepciones. Vamos a ver como lanzar excepciones de forma manual utilizando la cláusula throw. No confundir esta cláusula con la cláusula throws. La diferencia entre una y otra es que la cláusula throws la utilizamos en la declaración de un método para indicar que ese método podría lanzar una excepción mientras que la cláusula throw la podemos utilizar en cualquier punto del código para indicar que en ese punto concreto se lanza una excepción.

Para ver la cláusula throw lo vamos a hacer mediante un ejemplo:

package er;

 

import javax.swing.JOptionPane;

 

public class CompruebaMail {

 

      public static void main(String[] args) {

           

            String el_mail=JOptionPane.showInputDialog("Introduce mail");

           

            examina_mail(el_mail);

 

      }

      static void examina_mail (String mail) {

           

            int arroba=0;

           

            boolean punto=false;

           

            for(int i=0; i<mail.length(); i++) {

                 

                  if(mail.charAt(i)=='@') {

                       

                        arroba++;

                  }

                 

                  if(mail.charAt(i)=='.') {

                       

                        punto=true;

                  }

            }

           

            if(arroba==1 && punto==true) {

                 

                  System.out.println("Es correcto");

            }else {

                 

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

            }

      }

 

}

 

Es una aplicación que solicita mediante una ventana de JOptionPane la dirección del mail si esta dirección contiene una arroba y un punto pues te indica que es correcto, sino, te indica que la dirección no es correcta. Probamos:



Al pulsar el botón como contiene un arroba y un punto pues te indica que es correcto:



Si contiene más de un arroba o no contiene un arroba o no tiene punto o tiene más de un punto te indica que es incorrecto:




Si escribimos esto:



Nos indica que la dirección es correcta:



Sin embargo, no es correcto. A partir de aquí podemos hacer varias cosas, evaluar si tiene más de un arroba, si tiene más de dos puntos, donde va ubicado el arroba y el punto, si tiene más de 3 caracteres, etc.

En este caso, vamos a hacer que lance una excepción cuando tenga tres o menos caracteres.

Todo el trozo que evalúa la dirección mail es el siguiente:

Este trozo de código se va a ejecutar siempre y cuando la dirección mail tenga tres o más caracteres, por lo que antes del for creamos un condicional if:

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

                 

                 

            }

Si tiene 3 o menos caracteres se ejecuta lo que hay dentro del if, es decir, va a lanzar una excepción, ¿Qué tipo de excepción? Hay muchos tipos de errores en Java, por ejemplo, IOException no se adapta al tipo de error que nos va a dar ya que no accede a ficheros externos, el error se va a producir porque el String es demasiado corto. Puede ser que el tipo de error que nos da no se adapte a ninguna de los tipos de clases de error que hay en la librería de Java en este caso tendríamos que crear nuestras propias excepciones, esto lo veremos en el post siguiente, en este, caso podemos utilizar un tipo de error de Java, por ejemplo, ArrayIndexOutOfBoundsException

Lo primero que tenemos que hacer es instanciar  esta clase:

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

                 

                  ArrayIndexOutOfBoundsException e = new ArrayIndexOutOfBoundsException();

                 

            }

A esta clase le hemos dado el nombre de e, ahora lanzamos esta clase:

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

                 

                  ArrayIndexOutOfBoundsException e = new ArrayIndexOutOfBoundsException();

                 

                  throw e;

            }

Si ejecutamos la aplicación introducimos un mail con menos de tres caracteres nos va a lanzar una excepción de tipo ArrayIndexOutOfBoundsException aunque no tenga nada que ver el error con esta clase. Nos faltaría indicar el else:

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

                 

                  ArrayIndexOutOfBoundsException e = new ArrayIndexOutOfBoundsException();

                 

                  throw e;

            }else {

           

            for(int i=0; i<mail.length(); i++) {

                 

                  if(mail.charAt(i)=='@') {

                       

                        arroba++;

                  }

                 

                  if(mail.charAt(i)=='.') {

                       

                        punto=true;

                  }

            }

           

            if(arroba==1 && punto==true) {

                 

                  System.out.println("Es correcto");

            }else {

                 

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

            }

      }

      }

Si probamos la aplicación:



Nos va a lanzar la excepción:



No es necesario instanciar la clase y luego crear el throw esto se hace directamente en la cláusula throw:

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

                 

                  //ArrayIndexOutOfBoundsException e = new ArrayIndexOutOfBoundsException();

                 

                  throw new ArrayIndexOutOfBoundsException();

            }

Si dentro de un método se programa para que lance una excepción cuando haya un error en el programa podemos indicarle al método que se va a lanzar una excepción y esto lo hacemos con la cláusula throws.

static void examina_mail (String mail) throws ArrayIndexOutOfBoundsException {

Con esto conseguimos que para el resto de programadores vean que este método puede lanzar una excepción y que convendría capturar el error. Si no capturamos el error siempre nos va a salir la excepción en consola. Para ello podemos indicarle que es un tipo de error IOException, error no controlado

static void examina_mail (String mail) throws IOException {

           

            int arroba=0;

           

            boolean punto=false;

           

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

                 

                  //ArrayIndexOutOfBoundsException e = new ArrayIndexOutOfBoundsException();

                 

                  throw new IOException();

            }

De esta forma estamos obligados a declarar la estructura try… catch ¿dónde escribimos esta estructura? Al llamar al método, si vemos en el código cuando llamamos al método hay un error:



Lo crearíamos de la siguiente forma:

try {

            examina_mail(el_mail);

            }catch(IOException e) {

                 

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

            }

      }

Si probamos ahora:



Al pulsar el botón de Aceptar ya no se sale el error de excepción, sino, lo que hay dentro del System.out que le hemos indicando dentro del bloque catch:



Bueno pues esto ha sido todo, seguimos viendo las excepciones en los siguientes posts espero que se os haga ameno, intento hacerlo todo lo práctico posible, ir paso a paso, pero si veis que algo no está claro o que me he saltado algo que necesita explicación no dudéis en indicármelo. Hasta pronto!

10.4 LANZAMIENTO DE EXCEPCIONES << >> 10.6 CREACIÓNDE EXCEPCIONES PROPIAS




No hay comentarios:

Publicar un comentario