2012-06-22 8 views
6

Con la llamada a la API ImageIO.write(), obtengo NullPointerException cuando paso una ruta inexistente como "\\abc\abc.png". Paso el camino inexistente a propósito para probar algo, pero en lugar de obtener FileNotFoundException, obtengo NPE. ¿Porqué es eso?Con la llamada a la API "ImageIO.write()" obtengo NullPointerException

ImageIO.write() Se supone que API arroja IOException pero no sé por qué obtengo NPE.

Utilizo la cadena del mensaje de excepción para mostrarlo en un cuadro de mensaje al usuario, pero en este caso NPE.getLocalizedMessage() devuelve cadena vacía y, por lo tanto, la ventana emergente está vacía con solo un icono.

+0

Compartir el código donde se produce esta excepción favor – maksimov

+3

No existe un método ImageIO.write() tomando un camino String como argumento. Muéstranos tu código y el rastro de la pila de la excepción. –

+0

Además, incluso podría mostrar su 'stacktrace'. –

Respuesta

12

He es derecho, sin embargo. Por ejemplo, este código:

public static void main(String[] args) throws IOException { 
BufferedImage image = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB); 
File out = new File("\\\\ABC\\abc.png"); 
ImageIO.write(image, "png", out); 
} 

da

java.io.FileNotFoundException: \\ABC\abc.png (The network path was not found) 
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 javaapplication145.JavaApplication145.main(JavaApplication145.java:24) 
Exception in thread "main" java.lang.NullPointerException 
at javax.imageio.ImageIO.write(ImageIO.java:1538) 
at javaapplication145.JavaApplication145.main(JavaApplication145.java:24) 

La razón es que FileImageOutputStreamSpi.createOutputStreamInstance traga FileNotFoundException y luego el NPE viene cuando ImageIO.write trata de cerrar una corriente que no se abrió.

Por qué la excepción se suprime tan brutalmente, no sé. El fragmento de código es

try { 
return new FileImageOutputStream((File)output); 
} catch (Exception e) { 
e.printStackTrace(); 
return null; 
} 

La única solución es para verificar el camino antes de intentar utilizar ImageIO.

+0

¿No sería mejor atrapar solo NullPointerException? Y deja que otras excepciones suban al árbol. – TinusSky

1

Descubrí el motivo de NPE para el problema mencionado en este hilo. Peter Hull tiene toda la razón al decir

public static void main(String[] args) throws IOException { BufferedImage image = new BufferedImage(32, 32, BufferedImage.TYPE_INT_ARGB); File out = new File("\\\\ABC\\abc.png"); ImageIO.write(image, "png", out); } 

Así se ve exactamente mi código. Gracias Peter por destacar.

El motivo de este problema es que el nuevo FileImageOutputStream() arroja una excepción FileNotFoundException, pero un programador de Sun fue y detectó la excepción, imprimió el seguimiento de la pila y devolvió el valor nulo. Por eso ya no es posible capturar la excepción FileNotFoundException, ya está impresa. Poco después, el valor nulo devuelto causa una NullPointerException, que es lo que se arroja desde el método que llamé. Cuando imprimí el Stack Trace de la excepción, pude ver FileNotFoundException junto con NPE por el motivo mencionado anteriormente.

-Nayan

Cuestiones relacionadas