我想捕捉并忽略和ArrayIndexOutOfBoundsException错误(基本上它不是我可以控制的东西,所以我需要我的程序继续保持一致)。
但是我的try / catch对似乎没有捕获异常而忽略它。希望你能找出我做错了什么。
此行发生例外
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”中的异常java.lang.ArrayIndexOutOfBoundsException:无效索引:02 at com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID(Unknown Source) at com.lowagie.text.pdf.CMapAwareDocumentFont.decode(Unknown Source) at com.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(Unknown Source) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor.invokeOperator(Unknown Source) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor.processContent(Unknown Source) at com.lowagie.text.pdf.parser.PdfTextExtractor.getTextFromPage(Unknown Source) 在com.pdfextractor.main.Extractor.main(Extractor.java:64) 的
编辑:我已将try / catch置于for循环中并添加了堆栈跟踪
并删除了index = 1
答案 0 :(得分:4)
您正在调用的代码可能正在处理ArrayIndexOutOfBoundsException
并自行打印堆栈跟踪而无需重新抛出它。如果是这种情况,您将看不到被叫System.out.println
。
编辑:如果你想继续努力,最好知道PDFContentStreamProcessor#processContent
会抓住ArrayIndexOutOfBoundsException
,然后抛出com.lowagie.text.ExceptionConverter
的实例,这是一个RuntimeException
的子类。
答案 1 :(得分:3)
愚蠢的问题,但是你在同一个包中的catch中放入的ArrayIndexOutOfBoundsException是抛出的那个吗?即java.lang
或者也许抓住扔掉,看看它是否有效。
答案 2 :(得分:3)
也许这是不费脑子的(毕竟,我在过去的36小时里跑了3个小时),但是就像digiarnie和Ankur提到的那样:你试过简单catch (Exception e)
?
这绝对不是理想的,因为很明显它(以及Throwable t
建议)会捕捉到阳光下的每一个异常,而不仅限于ArrayOutOfBoundsException
。如果你还没有尝试过,那就想到那里。
答案 3 :(得分:1)
您应该修改代码,而不是使用此异常,以免超出数组边界!
大多数数组从0到array.length-1
如果用这个替换你的for循环,你可能会避免整个问题:
for (int page = 0;page < noPages;page++){
答案 4 :(得分:0)
你需要try / catch在for循环中。控制弹出到try catch,catch会触发,然后恢复控制,但for循环已经终止。
答案 5 :(得分:0)
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");
}
}
答案 6 :(得分:0)
也许这是一个愚蠢的问题......您确定在您发布的代码中抛出异常而不是在不同的方法中吗?
答案 7 :(得分:0)
该计划应该有效。你应该提供更多细节,包括你的班级名称。您可以尝试捕获异常或将一个带有一些s.o.p的finally块放入其中。
答案 8 :(得分:0)
这很奇怪 - 我实际上看了一下异常从(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。我看不出你的原始尝试捕捉不起作用的任何原因。
也许你应该发布全班?另外,您使用的是哪个版本的itext?
答案 9 :(得分:0)
等一下!你错过了一些括号:)你的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