10.2 THROWS / TRY / CATCH I

 Hola a todos, en el post anterior vimos que hay dos tipos de errores: excepciones comprobadas (IOException) y excepciones no comprobadas (RuntimeException).

Nos vamos a centrar en las excepciones comprobadas que son aquellas que generan un objeto perteneciente a la clase IOException, para conocer un poco más sobre esta clase vamos utilizar una aplicación que ya vimos en el bloque de Aplicaciones Swing que era leer una imagen al ejecutar el programa la imagen se repetía por todo el marco, era una bola roja:



El código de este archivo es el siguiente:

package swing;

 

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Image;

import java.io.File;

import java.io.IOException;

 

import javax.imageio.ImageIO;

import javax.swing.*;

 

public class TrabajandoImagenes {

 

       public static void main(String[] args) {

           

             MarcoConImagenes mimarco=new MarcoConImagenes();

           

             mimarco.setVisible(true);

           

             mimarco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

       }

 

}

 

class MarcoConImagenes extends JFrame{

     

       public MarcoConImagenes() {

           

             setTitle("Prueba con imagenes");

           

             setBounds(250, 300, 300, 200);

           

             LaminaConImagenes milamina =new LaminaConImagenes();

           

             add(milamina);

           

             milamina.setForeground(Color.BLACK);

       }

}

 

class LaminaConImagenes extends JPanel{

     

      public LaminaConImagenes() {

 

        

      }

     

       public void paintComponent(Graphics g) {

           

             super.paintComponent(g);

            

             //File mimagen=new File("src/swing/coche.jpg");

            

           

             int anchuraImagen=imagen.getWidth(this);

             int alturaImagen=imagen.getHeight(this);

 

             g.drawImage(imagen, 0, 0, null);

             for(int i=0; i<300; i++) {

                 for(int j=0; j<200; j++) {

                      

                   g.copyArea(0, 0, anchuraImagen, alturaImagen, anchuraImagen*i, alturaImagen*j);

                 }

          }

 

           

       }

       private Image imagen;

     

}

Nos vamos a ir a la parte del constructor de la lámina, LaminaConImagenes:



Es aquí donde vamos a añadir las imágenes mediante la cláusula Throws:

public static BufferedImage read(File input) thorws IOException{

                                   ……

                                   ……

                                   ……

                                     }

Cuando un método lleva la cláusula Throws significa que el método hace dos cosas, lo que hace el método es devolvernos un objeto de tipo BufferedImage esto si se ejecuta correctamente, sino, nos devuelve un error de tipo IOException, este error será un error controlado por lo que el propio lenguaje de programación Java nos obliga a tratar este error mediante la siguiente estructura:

try{

            ….

}catch(IOException){

            ….

            ….

}

Consiste en: “Intenta hacer tu trabajo y si no puedes en lugar de detener el programa vas a realizar esta otra cosa”.

Dentro de la cláusula try estaría el código que nuestro programa intentaría realizar si hay algún error se ejecutará lo que hay dentro de la estructura catch.

Pues teniendo clara esta explicación volvemos al código y recordamos que tenemos una variable de tipo Image llamada imagen:

private Image imagen;

Dentro del constructor de la lámina le vamos a indicar que esta variable es igual a la ruta donde tenemos la imagen:

      public LaminaConImagenes() {

 

            imagen=ImageIO.read(new File("src/swing/bola.gif"));

      }

Sin embargo, Eclipse nos está marcando un error:



Este error se debe a que el método read lanza una excepción porque así está definido en Throws IOException, para todos aquellos métodos que lanzan una excepción tienen que declarar la cláusula try… catch para tratar y manipular esa excepción. Para insertar esta línea de código en una estructura try catch Eclipse lo puede hacer automáticamente pulsando en Surround with try/catch:

      public LaminaConImagenes() {

 

            try {

                  imagen=ImageIO.read(new File("src/swing/bola.gif"));

            } catch (IOException e) {

                  System.out.println("La imagen no se encuentra");

            }

      }

Dentro del catch escribimos un System.out para que nos muestre una frase en la consola por si la imagen no se encuentra.

Si probamos el programa:



Se ejecuta correctamente, vamos a escribir mal la ruta donde se encuentra la imagen y al ejecutar se ejecuta la estructura catch:



Sin embargo, la excepción no se está ejecutando correctamente ya que solo debería aparecer la frase “La imagen no se encuentra”. Esto es debido a que hemos utilizado la variable de tipo Image llamada image que es la que almacena la ruta donde se encuentra la imagen, la estructura try… catch se ejecuta correctamente ya que si no encuentra la imagen se ejecuta lo que hay dentro del catch que sí que nos lo muestra pero a continuación salen un montón de líneas de error que no deberían salir y es porque después de ejecutar el bloque try… catch pasa al método paintComponent que nos pinta la imagen:



En este método le estamos indicando que tiene que guardar en la variable imagen tanto la anchura como la altura, cuando ocurre un error esta variable no se ha iniciado por lo que esta variable es nula de ahí el error que nos da.

Si vemos en la consola nos está dando un error de tipo NullPointerException:



No es de tipo IOException, este error hereda de la clase RuntimeException, es decir, excepción no comprobada, esto quiere decir que es un error que está en nuestras manos solventar. Esto lo solucionaríamos de la siguiente forma:

public void paintComponent(Graphics g) {

 

             super.paintComponent(g);

            

             if(imagen==null) {

                   

                   g.drawString("No podemos cargar la imagen", 10, 10);

             }else {

 

             int anchuraImagen=imagen.getWidth(this);

 

             int alturaImagen=imagen.getHeight(this);

             g.drawImage(imagen, 0, 0, null);

            

             for(int i=0; i<300; i++) {

 

                 for(int j=0; j<200; j++) {

 

                   g.copyArea(0, 0, anchuraImagen, alturaImagen, anchuraImagen*i, alturaImagen*j);

 

                 }

 

          }            }

 

Mediante un condicional le indicamos que si la imagen no se encuentra, es decir, es nula que nos muestre un error en la ventana esto lo hacemos mediante el método gdrawString y le indicamos que lo muestre en las coordenadas 10, 10 de la ventana. Si la imagen se encuentra que se ejecute lo que hay dentro del else, que nos pinte la imagen.

Si probamos la aplicación escribiendo un error en la ruta de la imagen para que no se muestre:



Podéis enviar vuestras dudas, comentarios, sugerencias, etc., a través de los comentarios del blog. Os espero en el próximo. Hasta pronto!

10.1 INTRODUCCIÓN A LASEXCEPCIONES << >> 10.3 THROWS / TRY / CATCH II



No hay comentarios:

Publicar un comentario