5

私のアプリケーションでは、BufferedImageを使用して PNG ファイルに保存しようとしていましたImageIO。ファイルはユーザーによって選択されるため、発生する可能性のあるエラーに対応する必要があります (たとえば、ユーザーが書き込み権限のない場所に保存しようとするなど)。しかし、私はIOExceptionそれが発生するのを捕まえることができません。

次のコードは問題を示しています。「/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 ブロックも役に立ちませんでした。

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

私は何を間違っていますか?

4

4 に答える 4

6

ImageIOそれは実装の詳細に由来します。Fileインスタンスをに渡さなければ問題を回避できますが、まず自分自身ImageIO.writeを開いてに渡してみてください。FileOutputStreamwrite

これは、 で何が起こるかをより正確に分析したものImageIO.writeです。行 1530 :

stream = createImageOutputStream(output);

行 1538 :

stream.close();

の実装を見ると、createImageOutputStreamを返すいくつかのコード パスが表示されますnull

于 2012-08-22T14:06:12.613 に答える
4

ImageIO.writeメソッドが を出力しているように見えますIOExceptionが、実際にはそれを処理せず、 で終わりNullPointerExceptionます。バグのあるライブラリのこの特定のケースでは、おそらく何かキャッチする必要がありますRuntimeException...

もちろん、ディレクトリが存在し、書き込み可能かどうかを事前にテストすることをお勧めします。

于 2012-08-22T14:07:04.667 に答える
0

It seems that ImageIO.write() wraps the FileNotFoundException into a NullPointerException.

You should catch NullPointerException, or better check file existence before invoking ImageIO.write().

于 2012-08-22T14:09:42.557 に答える
0

それを見ると、FileNotFoundException は javax.imageio.ImageIO.write 内で処理されており、その失敗によってヌル ポインター例外が発生しています。ファイルを保存する前に、ファイルのアクセス許可を確認してください。

于 2012-08-22T14:10:24.577 に答える