私のアプリケーションでは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)
注FileNotFoundException
がIOException
のサブクラスであるので、それが巻き込まれる必要があること。 2つ目のキャッチブロックは役に立ちませんでした。
catch (FileNotFoundException e) {
System.out.println("Caught FileNotFoundException!");
} catch (IOException e) {
System.out.println("Caught IOException!");
}
私は間違っていますか?
あなたの結論を正当化する「原因」はありません。 –