2012-08-22 144 views
5

在我的應用程序中,我試圖使用ImageIOBufferedImage保存爲PNG文件。該文件由用戶選擇,因此我需要對可能發生的錯誤做出反應(例如,用戶嘗試保存在他沒有寫入權限的位置)。但是我無法捕捉到發生的IOExceptionJava ImageIO:異常奇怪

以下代碼顯示了該問題。嘗試保存到「/ foo」應該爲* nix系統上的大多數用戶拋出異常,因爲它們在根目錄中沒有寫權限。

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

但是,沒有發現異常。輸出:

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) 

注意FileNotFoundExceptionIOException子類,所以它應該被逮住。第二個catch塊沒有幫助:

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

我在做什麼錯?

回答

6

它源於ImageIO實施的細節。如果您未將File實例傳遞給ImageIO.write,但您首先嚐試自己打開FileOutputStream並將其傳遞給write,您將繞過該問題。

這是對ImageIO.write中會發生什麼的更精確的分析。 Line 1530

stream = createImageOutputStream(output); 

Line 1538

stream.close(); 

如果你看一看的createImageOutputStream實現,你會看到一些代碼路徑返回null

4

它看起來像ImageIO.write方法打印IOException,但實際上不處理它,並以NullPointerException結束。在車庫的這種特殊情況下,也許你應該趕上任何RuntimeException ...

當然會更好,如果該目錄存在和is writable之前測試。

0

似乎ImageIO.write()包裹FileNotFoundExceptionNullPointerException

你應該趕上NullPointerException,或者在調用ImageIO.write()之前檢查文件的存在。

+3

沒有「造成」來證明您的結論。 –

0

通過它的外觀,FileNotFoundException被處理在javax.imageio.ImageIO.write中,並且失敗導致空指針異常。在嘗試保存之前嘗試檢查文件權限!