[英]java itext catching null exception pdf text extraction
使用以下代碼使用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錯誤?
謝謝
如果我對您的理解正確,那么您在文檔頁面的循環中已經嘗試過捕獲該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.<init>
)中已經發生了異常。 因此,您必須在構造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
構建PdfReader
其他代碼位置,也可能希望對其進行加固。
@BrunoLowagie最好將這種NPE轉化為帶標簽的肽段,不是嗎?
這很丑陋,但是如果您真的想捕獲它,請嘗試捕獲RuntimeException
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.