ImageIO.read を使用した NullPointerException
-
22-08-2019 - |
質問
イメージ ファイルを読み込もうとしているときに NPE が発生しますが、その理由は一生わかりません。これが私の行です:
BufferedImage source = ImageIO.read(new File(imgPath));
imgPath は基本的に有効であることが保証されており、ここに到達する直前にサーバーからファイルをコピーします。その行に到達すると、次のスタック トレースが得られます。
Exception in thread "Thread-26" java.lang.NullPointerException
at com.ctreber.aclib.image.ico.ICOReader.getICOEntry(ICOReader.java:120)
at com.ctreber.aclib.image.ico.ICOReader.read(ICOReader.java:89)
at javax.imageio.ImageIO.read(ImageIO.java:1400)
at javax.imageio.ImageIO.read(ImageIO.java:1286)
at PrintServer.resizeImage(PrintServer.java:981) <---My function
<Stack of rest of my application here>
また、これは出力ウィンドウにスローされます。
ICOファイルを作成できません:バイトを読み取れません:2
特に File コンストラクターは成功しているので、何が起こっているのかわかりません。同じような問題を抱えている人は見つからないようです。何かアイデアがある人はいますか?(Java 5 が違いを生む場合)
解決
私はいくつかのより多くの周りを突いて、あなたがするImageReader ImageIOにはそのようにそれを使用して読まれる指定できることを見出しました。私は、私たちのコードベースの周りつつい、我々はすでに、私はここで達成しようとしたまさに行うための場所で機能を持っていたことが分かりました。ただ、同様の問題に実行されます誰のために、ここでのコードの核心である(がらくたの一部は、上記で定義されるが、これはしようと誰もがそれを行うのに役立つはずです):
File imageFile = new File(filename);
Iterator<ImageReader> imageReaders = ImageIO.getImageReadersByFormatName("jpeg");
if ( imageReaders.hasNext() ) {
imageReader = (ImageReader)imageReaders.next();
stream = ImageIO.createImageInputStream(imageFile);
imageReader.setInput(stream, true);
ImageReadParam param = imageReader.getDefaultReadParam();
curImage = imageReader.read(0, param);
}
提案してくれてありがとうとすべてを助けます。
他のヒント
ファイルのコンストラクタは、ほぼ確実に、の関係なく、それが有効な/既存のファイルのを指しているかどうかの、成功します。少なくとも、私はあなたの基礎となるファイルがexists()
メソッドを介して存在しているかどうかを確認したい。
また、そのImageIO.read
はスレッドセーフではありません(それはスレッドセーフではありません、キャッシュされたImageReader
sを再利用します)注意します。
これは、あなたが簡単に並列に複数のファイルを読み込むことができないことを意味します。これを行うには、あなたがImageReader
sを自分で対処する必要があります。
あなたはImageIOでは、ファイルの間違った型としてそれを読むしようとしているファイルは、単に壊れている可能性があると考え、またはことがありますか?
1本のヒットでICOReader・クラスの結果のためにグーグル:<のhref = "http://www.java2s.com/Open-Source/Java-Document/Swing-Library/jide-common/com/jidesoft/icons/ IconsFactory.java.htm」のrel = "nofollowをnoreferrer"> JIDE共通からIconsFactory
する >。
どうやら彼らは同じ問題を抱えています:
// Using ImageIO approach results in exception like this.
// Exception in thread "main" java.lang.NullPointerException
// at com.ctreber.aclib.image.ico.ICOReader.getICOEntry(ICOReader.java:120)
// at com.ctreber.aclib.image.ico.ICOReader.read(ICOReader.java:89)
// at javax.imageio.ImageIO.read(ImageIO.java:1400)
// at javax.imageio.ImageIO.read(ImageIO.java:1322)
// at com.jidesoft.icons.IconsFactory.b(Unknown Source)
// at com.jidesoft.icons.IconsFactory.a(Unknown Source)
// at com.jidesoft.icons.IconsFactory.getImageIcon(Unknown Source)
// at com.jidesoft.plaf.vsnet.VsnetMetalUtils.initComponentDefaults(Unknown Source)
// private static ImageIcon createImageIconWithException(final Class<?> baseClass, final String file) throws IOException {
// try {
// InputStream resource =
// baseClass.getResourceAsStream(file);
// if (resource == null) {
// throw new IOException("File " + file + " not found");
// }
// BufferedInputStream in =
// new BufferedInputStream(resource);
// return new ImageIcon(ImageIO.read(in));
// }
// catch (IOException ioe) {
// throw ioe;
// }
// }
彼らは代わりに何をしたのですか?
private static ImageIcon createImageIconWithException(
final Class<?> baseClass, final String file)
throws IOException {
InputStream resource = baseClass.getResourceAsStream(file);
final byte[][] buffer = new byte[1][];
try {
if (resource == null) {
throw new IOException("File " + file + " not found");
}
BufferedInputStream in = new BufferedInputStream(resource);
ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
buffer[0] = new byte[1024];
int n;
while ((n = in.read(buffer[0])) > 0) {
out.write(buffer[0], 0, n);
}
in.close();
out.flush();
buffer[0] = out.toByteArray();
} catch (IOException ioe) {
throw ioe;
}
if (buffer[0] == null) {
throw new IOException(baseClass.getName() + "/" + file
+ " not found.");
}
if (buffer[0].length == 0) {
throw new IOException("Warning: " + file
+ " is zero-length");
}
return new ImageIcon(Toolkit.getDefaultToolkit().createImage(
buffer[0]));
}
生のバイトを読み込み、そこからイメージを作成するためにToolkit
を使用します。ですから、同じアプローチをしようとする場合があります。
「JPEGですが、JPEG拡張機能はありません。」
それかもしれません。
どうやら図書館は AC.lib-ICO NPEを投げています。このライブラリは Microsoft ICO ファイル形式を読み取ることを目的としているため、JPEG が問題になる可能性があります。
を使用して形式を明示的に提供することを検討してください。 代替方法.