如何解决捕获 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 举报,一经查实,本站将立刻删除。