未捕获并忽略ArrayIndexOutOfBoundsException

时间:2009-11-18 05:04:31

标签: java exception-handling indexoutofboundsexception

我想捕捉并忽略和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

10 个答案:

答案 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