2012-08-22 8 views
5

私のアプリケーションではImageIOを使用してBufferedImageをPNGファイルに保存しようとしていました。このファイルはユーザーが選択したもので、エラーが発生した場合(ユーザーが書き込み権限のない場所に保存しようとするなど)に対応する必要があります。しかし、私はそれが発生するIOExceptionをキャッチすることができません。Java 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のサブクラスであるので、それが巻き込まれる必要があること。 2つ目のキャッチブロックは役に立ちませんでした。

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にラップしているようです。

ImageIO.write()を呼び出す前に、NullPointerExceptionをキャッチするか、ファイルの存在を確認する必要があります。

+3

あなたの結論を正当化する「原因」はありません。 –

0

このように見えると、FileNotFoundExceptionがjavax.imageio.ImageIO.write内で処理されており、そのエラーによりNULLポインタ例外が発生しています。保存する前にファイルのアクセス許可をチェックしてみてください!

関連する問題