2009-05-18 22 views
0

イメージファイルを読み込もうとしているときにNPEを取得しています。ここに私の行があります:ImageIO.readを使用しているNullPointerException

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> 

を、これは私の出力ウィンドウにスローされます。

ICOFileを作成できません:2

:バイトを読み取ることができません。私は何が起こっているのか分かりません。特にFileコンストラクタが成功しているからです。私は似たような問題を抱えている人はいないようです。誰にもアイデアはありますか? (Java 5の場合は違いがあります)

+0

ICOReaderクラスはどこから来ていますか? –

+0

場所を含めた完全なスタックトレースを含めるように問題をアップデートしました。 – Morinar

答えて

2

私はもう少し詳しく調べて、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); 
} 

感謝をすべてを助けてください。

0

ファイルが壊れている可能性がありますか、ImageIOが間違った種類のファイルとして読み込もうとしていますか?

+0

それは良い考えですが、ファイルは間違いなく有効です...イメージビューアでプルアップしても問題ありません。それは間違ったタイプのファイルとしてそれを読もうとしている可能性があります...それはjpegですが、jpeg拡張子はありません。それが問題なのでしょうか? – Morinar

1

有効/既存ファイルを指しているかどうかにかかわらず、ファイルコンストラクタはほぼ確実に成功します。少なくとも、私は基礎ファイルがexists()メソッド経由で存在するかどうかチェックします。

+0

私は "if file.exists()"ブロックの中に読み込み行を落としてしまい、それをそこに作成して全く同じ方法で失敗しました。 – Morinar

0

ICOReaderクラスのグーグルでは、1回のヒットで結果がIconsFactoryからjide-commonになります。彼らは代わりに何をしました

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


は、どうやら彼らは同じ問題を抱えていましたか?生のバイトを読み込み、そこからイメージを作成するためにToolkitを使用します。

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

だから、同じアプローチをしようとする場合があります。

+0

うーん...私は周りをグーグルで回っているときにそれを見ましたが、明らかにそのページのソースを読んで、コメントアウトされた問題とその新しい解決策を見ることができませんでした。確かにそれはうまくいくように見えますが、失敗した行を回避するためのコードのように思えます(これは私を悲しくします)。 – Morinar

0

"jpegですが、jpeg 拡張子はありません。"

それかもしれません。

ライブラリAC.lib-ICOがNPEを投げているようです。このライブラリはMicrosoft ICOファイル形式を読み取ることを目的としているため、JPEGが問題となる可能性があります。

alternative methodを使用して明示的にフォーマットを提供することを検討してください。

1

また、ImageIO.readはスレッドセーフではありません(スレッドセーフではないキャッシュImageReaderを再利用します)。

これは、複数のファイルを並行して簡単に読み取ることができないことを意味します。これを行うには、自分でImageReaderを処理する必要があります。

関連する問題