未捕获并忽略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