不一致的javax.imageio.IIOException:IHDR块的长度不正确

3

我目前遇到一个非常奇怪的错误:当我使用参数-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005启动我的应用程序并通过Eclipse进行远程连接时,一切正常。但是当我删除这个参数(没有其他改变)时,我会得到以下异常:

Caused by: javax.imageio.IIOException: I/O error reading PNG header!
    at com.sun.imageio.plugins.png.PNGImageReader.readHeader(PNGImageReader.java:315) ~[na:1.8.0_92]
    at com.sun.imageio.plugins.png.PNGImageReader.readMetadata(PNGImageReader.java:654) ~[na:1.8.0_92]
    at com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1248) ~[na:1.8.0_92]
    at com.sun.imageio.plugins.png.PNGImageReader.read(PNGImageReader.java:1606) ~[na:1.8.0_92]
    at javax.imageio.ImageIO.read(ImageIO.java:1448) ~[na:1.8.0_92]
    at javax.imageio.ImageIO.read(ImageIO.java:1400) ~[na:1.8.0_92]
    at com.jgoodies.application.ResourceConverters$DefaultConverter.convertImage(ResourceConverters.java:452) ~[retest.jar:1.2.0-SNAPSHOT]
    ... 43 common frames omitted
Caused by: javax.imageio.IIOException: Bad length for IHDR chunk!
    at com.sun.imageio.plugins.png.PNGImageReader.readHeader(PNGImageReader.java:247) ~[na:1.8.0_92]
    ... 49 common frames omitted

由于我真的没有改变任何其他东西,我想这与这个问题无关,因为图像文件显然没有损坏。

由于这对我来说是一个外国项目,它可能与第三方库或类似内容有关。我在Mac上,使用Java 1.8.0_92,如果这有关的话。

更新:如果我删除特定的jar文件,问题也会消失。但是,稍后我会收到NoClassDefFoundError的错误,所以需要该jar文件。有什么想法、建议可以继续吗?


文件是一个普通的PNG文件还是一个特殊的“iPNG”文件,就像你所提到的问题一样? - Kayaman
这是一个普通的PNG文件,存储在某个jar文件中,如果我从类路径中移除有问题的jar文件或添加远程调试参数,那么它可以被顺利打开。 - roesslerj
2
你能分享导致异常的文件吗?还有JAR/库的名称可能会有所帮助...请注意,ImageIO是基于插件的,因此如果“有问题”的JAR包含一个或多个ImageReaderSpi,那可能会解释部分问题。此外,额外的运行时参数(或纯粹的巧合)可能会改变已安装插件的顺序。但这似乎有点牵强。确实很奇怪。 - Harald K
哇,这是解决方案的提示。如果我从有问题的jar文件中删除META-INF/services文件夹,问题也会消失...但另一个问题出现了。我不确定它们是否有关联,所以还没有最终解决方案。 - roesslerj
1个回答

0

我终于成功解决了这个问题,尽管我并不完全确定是什么导致了它,以及为什么它是一个Heisenbug。

正如haraldK在评论中建议的那样,有问题的jar包确实有一个ImageReaderSpi,但它还有一些类似混淆运行时魔术的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接