11

ImageIO.write()API呼び出しで、NullPointerExceptionのような存在しないパスを渡すと取得します"\\abc\abc.png"。何かをテストするために意図的に存在しないパスを渡しますが、 を取得する代わりにFileNotFoundExceptionを取得しNPEます。何故ですか?

ImageIO.write()API はスローするはずIOExceptionですが、なぜ取得しないのですかNPE.

例外メッセージ文字列を使用してメッセージ ボックスにユーザーに表示しますが、この場合NPE.getLocalizedMessage()は空の文字列を返すため、ポップアップはアイコンだけで空になります。

4

2 に答える 2

16

しかし、彼正しい。たとえば、次のコード:

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

与える

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)

その理由はFileImageOutputStreamSpi.createOutputStreamInstance、FileNotFoundException を飲み込み、ImageIO.write開かなかったストリームを閉じようとすると NPE が発生するためです。

なぜ例外が残酷に抑制されているのか、私にはわかりません。コードフラグメントは

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

唯一の解決策は、 ImageIO を使用するにパスを確認することです。

于 2012-06-22T10:29:28.930 に答える
1

このスレッドで言及されている問題のNPEの理由を見つけました。ピーターハルは絶対に正しいと言っています

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

これはまさに私のコードのようです。強調表示してくれたPeterに感謝します。

この問題の理由は、新しいFileImageOutputStream()がFileNotFoundExceptionをスローしますが、一部のSunプログラマーが例外をキャッチし、スタックトレースを出力し、nullを返したためです。これが、FileNotFoundExceptionをキャッチすることができなくなった理由です-すでに印刷されています。その後まもなく、返されたnull値によってNullPointerExceptionが発生します。これは、私が呼び出したメソッドからスローされたものです。例外のスタックトレースを出力すると、上記の理由でNPEとともにFileNotFoundExceptionが表示されました。

-ナヤン

于 2012-06-22T10:53:09.937 に答える