2012-06-22 37 views
6

Với ImageIO.write() Cuộc gọi API, tôi nhận được NullPointerException khi tôi chuyển một đường dẫn không tồn tại như "\\abc\abc.png". Tôi vượt qua con đường không tồn tại cố ý để kiểm tra một cái gì đó nhưng thay vì nhận được FileNotFoundException, tôi nhận được NPE. Tại sao vậy?Với cuộc gọi API "ImageIO.write()", tôi nhận được NullPointerException

ImageIO.write() API có nghĩa vụ phải ném IOException nhưng không lý do tại sao tôi nhận được NPE.

Tôi sử dụng chuỗi thông báo ngoại lệ để hiển thị nó trong hộp thư cho người dùng nhưng trong trường hợp này NPE.getLocalizedMessage() trả về chuỗi trống và do đó cửa sổ bật lên trống với chỉ một biểu tượng trên đó.

+0

Chia sẻ mã nơi ngoại lệ này xảy ra, vui lòng – maksimov

+3

Không có phương pháp ImageIO.write() tham gia đường dẫn chuỗi làm đối số. Cho chúng tôi thấy mã của bạn và dấu vết ngăn xếp của ngoại lệ. –

+0

Ngoài ra, bạn thậm chí có thể hiển thị 'stacktrace' của mình. –

Trả lời

12

He . Ví dụ, đoạn mã này:

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); 
} 

cho

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) 

Lý do là FileImageOutputStreamSpi.createOutputStreamInstance nuốt FileNotFoundException và sau đó NPE đến khi ImageIO.write cố gắng để đóng một dòng mà không mở.

Tại sao ngoại lệ bị ngăn chặn quá tàn nhẫn, tôi không biết. Đoạn mã là

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

Giải pháp duy nhất là để xác minh con đường trước cố gắng sử dụng ImageIO.

+0

Sẽ không tốt hơn nếu chỉ bắt NullPointerException? Và để các ngoại lệ khác đi lên cây. – TinusSky

1

Tôi đã tìm ra lý do cho NPE cho vấn đề được đề cập trong chuỗi này. Peter Hull hoàn toàn đúng khi nói

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); } 

Đây chính xác là mã của tôi. Cảm ơn Peter đã nêu bật.

Lý do cho vấn đề này là FileImageOutputStream() ném một FileNotFoundException nhưng một số lập trình viên Sun đã đi và bắt được ngoại lệ, in dấu vết ngăn xếp và trả về null. Đó là lý do tại sao nó không còn có thể nắm bắt các FileNotFoundException - nó đã được in. Ngay sau đó, giá trị null trả về gây ra một NullPointerException, đó là những gì nó được ném ra khỏi phương thức mà tôi đã gọi. Khi in Dấu vết ngăn xếp của ngoại lệ, tôi có thể thấy FileNotFoundException cùng với NPE vì lý do được đề cập ở trên.

-Nayan

Các vấn đề liên quan