5

我想捕获并忽略 ArrayIndexOutOfBoundsException 错误(基本上这不是我可以控制的,所以我需要我的程序继续运行)。

但是,我的 try/catch 对似乎没有捕捉到异常并忽略它。希望你能找出我做错了什么。

异常发生在这一行

内容 = 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");
    }    
}

线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常:索引无效:com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID(Unknown Source) at com.lowagie.text.pdf.CMapAwareDocumentFont.decode(Unknown Source) at com 的 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.PdfContentStreamProcessor.processContent(未知来源)在 com.lowagie.text.pdf.parser .PdfTextExtractor.getTextFromPage(Unknown Source) at com.pdfextractor.main.Extractor.main(Extractor.java:64)

编辑:我已将 try/catch 放在 for 循环中
,并添加了堆栈跟踪
并删除了 index=1

4

10 回答 10

4

您正在调用的代码可能正在处理ArrayIndexOutOfBoundsException并自行打印堆栈跟踪而不重新抛出它。如果是这种情况,您将看不到您的System.out.println被叫。

编辑:如果你想继续前进,最好知道PDFContentStreamProcessor#processContent将捕获ArrayIndexOutOfBoundsException然后抛出它的实例com.lowagie.text.ExceptionConverter,它是RuntimeException.

于 2009-11-18T05:26:21.210 回答
3

愚蠢的问题,但是 ArrayIndexOutOfBoundsException 是您从与被抛出的包相同的包中放入的 ArrayIndexOutOfBoundsException 吗?即java.lang

或者也许可以抓住可扔的东西,看看它是否有效。

于 2009-11-18T05:23:06.270 回答
3

也许这很简单(毕竟,我在过去的 36 小时内只睡了 3 小时),但正如 digiarnie 和 Ankur 所说的那样:你试过简单catch (Exception e)吗?

这绝对不是理想的,因为显然它(连同Throwable t建议)会捕捉到阳光下的每一个异常,不限于ArrayOutOfBoundsException. 如果你还没有尝试过,只是想出主意。

于 2009-11-18T05:45:31.933 回答
1

而不是使用这个异常,你应该修复你的代码,这样你就不会越过数组边界!

大多数数组从 0 到 array.length-1

如果你用这个替换你的 for 循环,你可能会避免整个问题:

for (int page = 0;page < noPages;page++){
于 2009-11-18T05:09:04.440 回答
0

您需要将 try/catch 放在 forloop 中。控制弹出到try catch,catch触发,然后恢复控制,但forloop已经终止。

于 2009-11-18T05:06:37.330 回答
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");
        }
    }
于 2009-11-18T05:10:27.187 回答
0

也许这是一个愚蠢的问题...您确定异常是在您发布的代码中引发的,而不是在不同的方法中引发的吗?

于 2009-11-18T06:32:40.123 回答
0

该程序应该有效。您应该提供更多详细信息,包括您的班级名称。您可以尝试通过捕获 Exception 或在 finally 块中放置一些 sop 来尝试。

于 2009-11-18T06:56:59.343 回答
0

这很奇怪 - 我实际上在抛出异常的方法中查看了 itext 的源 (CMapAwareDocumentFont.decodeSingleCID),它看起来像这样:

 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 异常。我看不出您原来的 try-catch 不起作用的任何原因。

也许您应该发布整个班级?另外,您使用的是哪个版本的 itext?

于 2009-11-18T07:47:23.783 回答
0

等一下!你在那里缺少一些大括号:) 你的 catch 语句在你的 for 语句之外!你有这个:

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
于 2009-11-18T07:51:27.067 回答