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