Java 捕获IIOException时出现问题已捕获

Java 捕获IIOException时出现问题已捕获,java,exception,Java,Exception,我目前正在编写一个程序,从不同来源读取大量图片,使用PDFBox生成PDF。 有些图片抛出IIOException,这没关系,我捕捉到它并通知用户图片无法读取。 其他一些也抛出了IIOException: javax.imageio.IIOException:JFIF APP0必须是SOI之后的第一个标记 没有被我的try-catch块捕获的。如何使引发此异常的所有图片具有相同的行为 这是我的try-catch块: 83 try { 84 if (new File(picture

我目前正在编写一个程序,从不同来源读取大量图片,使用PDFBox生成PDF。 有些图片抛出IIOException,这没关系,我捕捉到它并通知用户图片无法读取。 其他一些也抛出了IIOException:

javax.imageio.IIOException:JFIF APP0必须是SOI之后的第一个标记

没有被我的try-catch块捕获的。如何使引发此异常的所有图片具有相同的行为

这是我的try-catch块:

83    try {
84      if (new File(picture).exists()) {
85          // Some pictures throws an exception here 
86          PDImageXObject pdImage = PDImageXObject.createFromFile(picture, document);
87          contentStream.drawImage(pdImage, x, y, width, height);
88      } else {
89          PDImageXObject pdImage = PDImageXObject.createFromFile(defaultPicture, document);
90          contentStream.drawImage(pdImage, x, y, width, height);
91      }
92          
93  } catch(IIOException e) {
94      PDImageXObject pdImage = PDImageXObject.createFromFile(defaultPicture, document);
95      contentStream.drawImage(pdImage, x, y, width, height);
96      System.out.println("Problem reading this file : " + picture);
97  }
编辑: 堆栈跟踪:

javax.imageio.IIOException: JFIF APP0 must be first marker after SOI
    at com.sun.imageio.plugins.jpeg.JPEGMetadata.<init>(JPEGMetadata.java:224)
    at com.sun.imageio.plugins.jpeg.JPEGImageReader.getImageMetadata(JPEGImageReader.java:1023)
    at org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory.getNumComponentsFromImageMetadata(JPEGFactory.java:213)
    at org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory.retrieveDimensions(JPEGFactory.java:182)
    at org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory.createFromByteArray(JPEGFactory.java:103)
    at org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory.createFromStream(JPEGFactory.java:85)
    at org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject.createFromFileByExtension(PDImageXObject.java:241)
    at org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject.createFromFile(PDImageXObject.java:202)
    at myClass(ServiceGenerationPDF.java:85)
    at 
javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6535)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6300)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4891)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
    at java.awt.Container.dispatchEventImpl(Container.java:2280)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)```
javax.imageio.IIOException:JFIF APP0必须是SOI之后的第一个标记
在com.sun.imageio.plugins.jpeg.JPEGMetadata上。(JPEGMetadata.java:224)
在com.sun.imageio.plugins.jpeg.JPEGImageReader.getImageMetadata(JPEGImageReader.java:1023)上
位于org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory.getNumComponentsFromImageMetadata(JPEGFactory.java:213)
位于org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory.retrieveDimensions(JPEGFactory.java:182)
位于org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory.createFromByteArray(JPEGFactory.java:103)
位于org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory.createFromStream(JPEGFactory.java:85)
位于org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject.createFromFileByExtension(PDImageXObject.java:241)
位于org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject.createFromFile(PDImageXObject.java:202)
在myClass上(ServiceGenerationPDF.java:85)
在
fireActionPerformed(AbstractButton.java:2022)
位于javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
在javax.swing.DefaultButtonModel.fireActionPerformed上(DefaultButtonModel.java:402)
在javax.swing.DefaultButtonModel.setPressed中(DefaultButtonModel.java:259)
在javax.swing.plaf.basic.BasicButtonListener.MouseRelease(BasicButtonListener.java:252)
位于java.awt.Component.ProcessMouseeEvent(Component.java:6535)
位于javax.swing.JComponent.ProcessMouseeEvent(JComponent.java:3324)
位于java.awt.Component.processEvent(Component.java:6300)
位于java.awt.Container.processEvent(Container.java:2236)
位于java.awt.Component.dispatchEventImpl(Component.java:4891)
位于java.awt.Container.dispatchEventImpl(Container.java:2294)
位于java.awt.Component.dispatchEvent(Component.java:4713)
位于java.awt.LightweightDispatcher.RetargetMouseeEvent(Container.java:4888)
位于java.awt.LightweightDispatcher.ProcessMouseeEvent(Container.java:4525)
位于java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
位于java.awt.Container.dispatchEventImpl(Container.java:2280)
位于java.awt.Window.dispatchEventImpl(Window.java:2750)
位于java.awt.Component.dispatchEvent(Component.java:4713)
位于java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
在java.awt.EventQueue.access$500(EventQueue.java:97)
在java.awt.EventQueue$3.run(EventQueue.java:709)
在java.awt.EventQueue$3.run(EventQueue.java:703)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
位于java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
在java.awt.EventQueue$4.run(EventQueue.java:731)
在java.awt.EventQueue$4.run(EventQueue.java:729)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
位于java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
位于java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
在java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)中
位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:105)
位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
在java.awt.EventDispatchThread.run(EventDispatchThread.java:82)```

您不应该将实际的处理代码作为catch块的一部分。话虽如此,抛出的是catch块中的
PDImageXObject.createFromFile
。因为它不在单独的try/catch块中,所以不会捕获异常

如果您尝试这段代码,您将看到每个IIOException都被捕获

try {
    if (new File(picture).exists()) {
        // Some pictures throws an exception here 
        PDImageXObject pdImage = PDImageXObject.createFromFile(picture, document);
        contentStream.drawImage(pdImage, x, y, width, height);
    } else {
        PDImageXObject pdImage = PDImageXObject.createFromFile(defaultPicture, document);
        contentStream.drawImage(pdImage, x, y, width, height);
    }
        
} catch(IIOException e) {
    System.out.println("Problem reading this file : " + picture);
}

为什么要在两个不同的块中绘制默认图像-
else
catch
?̀defaultPicture`可能是错误的,因此它会在
catch
块中引发异常吗?
else
块中的图片是在假定图片不存在的情况下绘制的(未提供,或名称有问题)。
catch
块中的一个用于防止读取文件时出现问题。我编辑了我的文章,包括行号和堆栈tace,以澄清这一点:)尝试使用twelvemonkeys库:错误指示的行是if块中的行,因此此解决方案不起作用。此外,catch块中的PDImageXObject.createFromFile使用与else块中工作的图片相同的图片。如果出现异常,您建议如何显示默认图片?在程序启动时将其缓存,如果试图读取默认文件引发异常,则拒绝实际运行程序?这更像是一个设计问题,而不是编程问题,因此这实际上取决于您想做什么,但如果您无法实际读取默认图片,则这与显示它的要求相反。默认图片是正常的,并且不会引发任何错误。我最初的意图是在出现错误时显示此工作默认图片。因为您没有提供引发异常的代码行号、堆栈跟踪或行号,所以我只能在此处假设未捕获异常