【发布时间】:2013-02-28 11:23:30
【问题描述】:
当使用 itext 5.3.4 使用此代码提取文本表单 pdf 时:
try {
reader = new PdfReader(thepdffilename);
} catch (IOException e) {
openok=false;
}
if (openok==true){
int numberOfPages = reader.getNumberOfPages();
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
for (int page = 1; page <= numberOfPages; page++){
try {
SimpleTextExtractionStrategy strategy = parser.processContent(page, new SimpleTextExtractionStrategy());
content = content + strategy.getResultantText();
} catch (Throwable t) {
crap=true;
break;
}
}
reader.close();
}
但是,GooglePlay 偶尔会崩溃和 ANR 报告 itext 中存在 NP 异常。
java.lang.NullPointerException in com.itextpdf.text.pdf.PdfReader$PageRefs.readPages at
com.itextpdf.text.pdf.PdfReader$PageRefs.readPages(PdfReader.java:3382) at
com.itextpdf.text.pdf.PdfReader$PageRefs.<init>(PdfReader.java:3350) at com.itextpdf.text.pdf.PdfReader$PageRefs.<init>(PdfReader.java:3328) at
com.itextpdf.text.pdf.PdfReader.readPages(PdfReader.java:1003) at com.itextpdf.text.pdf.PdfReader.readPdf(PdfReader.java:530) at
com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:170) at
com.itextpdf.text.pdf.PdfReader.<init>(PdfReader.java:159)
3382行的5.3.4源码是:
3374 void readPages() throws IOException {
3375 if (refsn != null)
3376 return;
3377 refsp = null;
3378 refsn = new ArrayList<PRIndirectReference>();
3379 pageInh = new ArrayList<PdfDictionary>();
3380 iteratePages((PRIndirectReference)reader.catalog.get(PdfName.PAGES));
3381 pageInh = null;
3382 reader.rootPages.put(PdfName.COUNT, new PdfNumber(refsn.size()));
3383 }
3384
3385 void reReadPages() throws IOException {
3386 refsn = null;
3387 readPages();
3388 }
因此,当某些 pdf 文件提取其文本时出现问题,并且可能永远不会排序的原因可能永远不会被排序,因为我没有问题的 pdf。
我需要的是一种捕获 NP 异常的方法,这样我的应用就不会崩溃。
我试过了
} catch (Exception e) {
作为最后的手段尝试捕获任何异常
} catch (Throwable t) {
有谁知道如何捕获这个特定的 itext 错误?
谢谢
【问题讨论】:
-
为什么要使用错误标志而不是让异常冒出循环?
-
另外:从不
catch (Throwable t)。除非您正在编写应用服务器或其他涉及自定义类加载器的东西,否则它没有用处。 -
millimoose,这部分代码在 doInBackground AsyncTask 中。然后我可以检查 onPostExecute 中的错误标志,我可以在其中相应地处理和敬酒消息。
标签: java nullpointerexception try-catch itext