【问题标题】:java itext catching null exception pdf text extractionjava itext捕获空异常pdf文本提取
【发布时间】: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源码是:

http://grepcode.com/file/repo1.maven.org/maven2/com.itextpdf/itextpdf/5.3.4/com/itextpdf/text/pdf/PdfReader.java?av=f

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


【解决方案1】:

如果我对您的理解正确,您已经在文档页面的循环中尝试捕获该 NPE:

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;
    }
}

如果您仔细查看您的异常,但是...

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.<init>(PdfReader.java:159)

您会看到异常已经发生在 PdfReader 构造中 (PdfReader.&lt;init&gt;)。因此,您必须在构建 PdfReader 的地方已经捕获 NPE:

try {
    reader = new PdfReader(thepdffilename);
} catch (IOException e) {
    openok=false;
} catch (NullPointerException npe) { // !!
    openok=false;                    // !!
}

或者如果你不想冒险

try {
    reader = new PdfReader(thepdffilename);
} catch (Throwable t) {              // !!
    openok=false;
}

如果您也有其他代码位置,其中构造了 PdfReader,您可能也想强化它们。

@BrunoLowagie 最好将这个 NPE 转换为标记的异常,不是吗?

【讨论】:

  • 很好看的 mkl,我错过了打开 pdf 文件时发生的事情。非常感谢
  • Bruno Lowagie,我是否需要等待 itext 的新版本才能获得修复?我以为 5.3.4 是当前版本?顺便说一句,itext 救了我的命,谢谢!
【解决方案2】:

这很丑,但如果你真的想抓住它,试着抓住 RuntimeException

【讨论】:

  • RuntimeExceptionThrowable;因此,user1706269 已经隐式尝试捕捉它们。
  • ...也就是说,除非您想指示在更合适的代码位置捕获 RuntimeException... ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 2016-03-10
  • 2010-11-25
  • 2012-10-26
相关资源
最近更新 更多