微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

捕获 IIOException 已捕获的问题

如何解决捕获 IIOException 已捕获的问题

我目前正在编写一个程序,该程序从不同来源读取大量图片以使用 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,height);
91      }
92          
93  } catch(IIOException e) {
94      PDImageXObject pdImage = PDImageXObject.createFromFile(defaultPicture,document);
95      contentStream.drawImage(pdImage,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)```

解决方法

您不应该将实际处理代码作为 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,height);
    }
        
} catch(IIOException e) {
    System.out.println("Problem reading this file : " + picture);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?