2012-08-22 21 views
5

En mi aplicación, estaba intentando guardar un archivo BufferedImage en un archivo PNG utilizando ImageIO. El archivo es elegido por el usuario, por lo que debo reaccionar a los errores que puedan ocurrir (por ejemplo, el usuario intenta guardar en una ubicación para la que no tiene permiso de escritura). Sin embargo, no puedo ver el IOException que ocurre.Java ImageIO: Exception Weirdness

El siguiente código muestra el problema. Intentar guardar en "/ foo" debería arrojar una excepción para la mayoría de los usuarios en los sistemas * nix, ya que no tienen permiso de escritura en el directorio raíz.

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

public class IOTest { 

    public static void main(String[] args) { 
     BufferedImage img = new BufferedImage(640, 480, 
       BufferedImage.TYPE_INT_RGB); 
     try { 
      File f = new File("/foo"); 
      ImageIO.write(img, "png", f); 
     } catch (IOException e) { 
      System.out.println("Caught IOException!"); 
     } 
    } 
} 

Sin embargo, la excepción no se detecta. Salida:

java.io.FileNotFoundException: /foo (Permission denied) 
    at java.io.RandomAccessFile.open(Native Method) 
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:233) 
    at javax.imageio.stream.FileImageOutputStream.<init>(FileImageOutputStream.java:69) 
    at com.sun.imageio.spi.FileImageOutputStreamSpi.createOutputStreamInstance(FileImageOutputStreamSpi.java:55) 
    at javax.imageio.ImageIO.createImageOutputStream(ImageIO.java:419) 
    at javax.imageio.ImageIO.write(ImageIO.java:1530) 
    at IOTest.main(IOTest.java:16) 
Exception in thread "main" java.lang.NullPointerException 
    at javax.imageio.ImageIO.write(ImageIO.java:1538) 
    at IOTest.main(IOTest.java:16) 

Tenga en cuenta que FileNotFoundException es una subclase de IOException por lo que debe quedar atrapado. Un segundo bloque catch tampoco ayudó:

catch (FileNotFoundException e) { 
    System.out.println("Caught FileNotFoundException!"); 
} catch (IOException e) { 
    System.out.println("Caught IOException!"); 
} 

¿Qué estoy haciendo mal?

Respuesta

6

Se deriva de los detalles de la implementación ImageIO. Evitará el problema si no pasa la instancia File al ImageIO.write, pero primero intente abrir un FileOutputStream usted mismo y páselo a write.

Este es un análisis más preciso de lo que ocurre en ImageIO.write. Line 1530:

stream = createImageOutputStream(output); 

Line 1538:

stream.close(); 

Y si se toma un vistazo a la implementación de createImageOutputStream, verá varias rutas de código que devuelven null.

4

Parece que el método ImageIO.write imprime el IOException pero realmente no lo maneja y termina con un NullPointerException. En este caso específico de una biblioteca con errores, tal vez usted debe la captura de cualquier RuntimeException ...

Por supuesto que será mejor probar antes si existe el directorio y is writable.

0

Parece que ImageIO.write() envuelve el FileNotFoundException en un NullPointerException.

Debe capturar NullPointerException, o verificar mejor la existencia del archivo antes de invocar ImageIO.write().

+3

No hay "causado por" para justificar su conclusión. –

0

Por lo que parece, la excepción FileNotFoundException se está manejando dentro de javax.imageio.ImageIO.write y esa falla está causando una excepción de puntero nulo. ¡Intente verificar los permisos del archivo antes de intentar guardarlo!