未捕获并忽略ArrayIndexOutOfBoundsException
我想捕捉并忽略和ArrayIndexOutOfBoundsException错误(基本上它不是我可以控制的东西,所以我需要我的程序继续前进)。
但是我的try / catch对似乎没有捕获exception并忽略它。 希望你能挑出我做错了什么。
此行发生exception
content = extractor.getTextFromPage(page);
这是我的代码:
for(int page=1;page<=noPages;page++){ try{ System.out.println(page); content = extractor.getTextFromPage(page); } } catch (ArrayIndexOutOfBoundsException e){ System.out.println("This page can't be read"); } }
线程“main”中的exceptionjava.lang.ArrayIndexOutOfBoundsException:来自com的com.lowagie.text.pdf.CMapAwareDocumentFont.decode(未知来源)的com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID(未知来源)中的索引:02无效.lowagie.text.pdf.parser.PdfContentStreamProcessor.decode(Unknown Source)at com.lowagie.text.pdf.parser.PdfContentStreamProcessor.displayPdfString(Unknown Source)at com.lowagie.text.pdf.parser.PdfContentStreamProcessor $ ShowText.invoke (未知来源)com.lowagie.text.pdf.parser.PdfContentStreamProcessor.invokeOperator(未知来源)com.lowagie.text.pdf.parser上的com.lowagie.text.pdf.parser.PdfContentStreamProcessor.processContent(未知来源) com.pdfextractor.main.Extractor.main上的.pdfTextExtractor.getTextFromPage(未知来源)(Extractor.java:64)
编辑:我已将try / catch放在for循环中
并添加了堆栈跟踪
并删除了index = 1
愚蠢的问题,但是你在同一个包中的catch中放入的ArrayIndexOutOfBoundsException是抛出的那个吗? 即java.lang
或者也许抓住扔掉,看看它是否有效。
您正在调用的代码可能正在处理ArrayIndexOutOfBoundsException
并自行打印堆栈跟踪而无需重新抛出它。 如果是这种情况,您将看不到调用的System.out.println
。
编辑:如果你想继续努力,最好知道PDFContentStreamProcessor#processContent
将捕获ArrayIndexOutOfBoundsException
,然后抛出其com.lowagie.text.ExceptionConverter
的实例,它是RuntimeException
的子类。
也许这是一个明智的选择(毕竟,我在过去的36小时里跑了3个小时),但是就像digiarnie和Ankur提到的那样:你试过简单地catch (Exception e)
吗?
它绝对不是理想的,因为很明显它(以及Throwable t
建议)将捕获阳光下的每个exception,而不仅限于ArrayOutOfBoundsException
。 如果你还没有尝试过,那就想到了那里的想法。
您应该修复代码,而不是使用此exception,这样您就不会超出数组边界!
大多数数组从0到array.length-1计数
如果用这个替换你的for循环,你可能会避免整个问题:
for (int page = 0;page < noPages;page++){
你需要try / catch才能进入forloop。 控制弹出到try catch,catch会触发,然后恢复控制,但是forloop已经被终止了。
for(int page=1;page<=noPages;page++) { try { content = extractor.getTextFromPage(page); System.out.println(content); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("This page can't be read"); } }
也许这是一个愚蠢的问题……您确定在您发布的代码中抛出exception而不是在不同的方法中吗?
该计划应该有效。 你应该提供更多细节,包括你的class级名称。 您可以尝试捕获Exception或将finally块放入其中。
这很奇怪 – 我实际上看了一下exception从(CMapAwareDocumentFont.decodeSingleCID)抛出的方法中的itext源代码,它看起来像这样:
private String decodeSingleCID(byte[] bytes, int offset, int len){ if (toUnicodeCmap != null){ if (offset + len > bytes.length) throw new ArrayIndexOutOfBoundsException("Invalid index: " + offset + len); return toUnicodeCmap.lookup(bytes, offset, len); } if (len == 1){ return new String(cidbyte2uni, 0xff & bytes[offset], 1); } throw new Error("Multi-byte glyphs not implemented yet"); }
它抛出的ArrayIndexOutOfBoundsException是标准的Java。 我看不出你的原始尝试捕捉不起作用的任何原因。
也许你应该发布全class? 另外,您使用的是哪个版本的itext?
等一等! 你错过了一些括号:)你的catch语句超出了你的陈述! 你有这个:
for(int page=1;page<=noPages;page++){ try{ System.out.println(page); content = extractor.getTextFromPage(page); } } catch (ArrayIndexOutOfBoundsException e){ System.out.println("This page can't be read"); } }
它应该是:
for(int page=1;page<=noPages;page++) { try{ System.out.println(page); content = extractor.getTextFromPage(page); } catch (ArrayIndexOutOfBoundsException e){ System.out.println("This page can't be read"); } } //end for loop }//This closes your method or whatever is enclosing the for loop