ArrayIndexOutOfBoundsException не перехватывается и игнорируется - PullRequest
5 голосов
/ 18 ноября 2009

Я хочу поймать и проигнорировать ошибку 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 на com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID (неизвестный источник) на com.lowagie.text.pdf.CMapAwareDocumentFont.decode (неизвестный источник) на com.lowagie.text.pdf.parser.PdfContentStreamProcessor.decode (неизвестный источник) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor.displayPdfString (неизвестный источник) в 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 (Неизвестный источник) в com.pdfextractor.main.Extractor.main (Extractor.java:64)

edit: Я поместил try / catch в цикл for
, добавил трассировку стека
и удалил index = 1

Ответы [ 10 ]

4 голосов
/ 18 ноября 2009

Возможно, что код, который вы вызываете, обрабатывает ArrayIndexOutOfBoundsException и печатает трассировку стека самостоятельно, не перебрасывая ее. Если это так, вы не увидите, что ваш System.out.println вызван.

РЕДАКТИРОВАТЬ: Если вы хотите продолжать пыхтеть, было бы хорошо знать, что PDFContentStreamProcessor#processContent поймает ArrayIndexOutOfBoundsException, а затем бросит экземпляр его com.lowagie.text.ExceptionConverter, который является подклассом RuntimeException.

3 голосов
/ 18 ноября 2009

Может быть, это и ежу понятно (в конце концов, я бегаю по 3 часа сна за последние 36 часов), но в соответствии с тем, что упомянули дигиарни и Анкур: вы пробовали просто catch (Exception e)?

Это определенно не идеально, так как очевидно (вместе с предложением Throwable t) будет ловить все исключения под солнцем, не ограничиваясь ArrayOutOfBoundsException. Просто подумай, если ты еще не попробовал.

3 голосов
/ 18 ноября 2009

Глупый вопрос, но является ли исключение ArrayIndexOutOfBoundsException, которое вы добавили, в тот же пакет, что и брошенный? то есть java.lang

Или, возможно, поймать бросок, чтобы увидеть, если это вообще работает.

1 голос
/ 18 ноября 2009

Вместо использования этого исключения вы должны исправить свой код, чтобы не выходить за границы массива!

Большинство массивов отсчитывают от 0 до array.length-1

Если вызамените цикл for следующим: вы можете избежать этой проблемы:

for (int page = 0;page < noPages;page++){
0 голосов
/ 18 ноября 2009

Подождите секунду! Вы пропустили несколько скобок там :) Ваше утверждение 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
0 голосов
/ 18 ноября 2009

Это странно - я действительно посмотрел на источник 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. Я не вижу причин, по которым ваша оригинальная пробная версия не работает.

Может быть, вы должны опубликовать весь класс? Кроме того, какую версию itext вы используете?

0 голосов
/ 18 ноября 2009

Программа должна была работать. Вы должны дать более подробную информацию, включая имя вашего класса. Вы можете попробовать перехватить Exception или поместить блок finally с некоторым количеством s.o.p.

0 голосов
/ 18 ноября 2009

Возможно, это глупый вопрос ... Вы уверены, что исключение выдается в коде, который вы разместили, а не другим способом?

0 голосов
/ 18 ноября 2009
    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");
        }
    }
0 голосов
/ 18 ноября 2009

вам нужно попробовать / поймать, чтобы оказаться внутри петли. управление появляется в попытке поймать, загорается и впоследствии возобновляет управление, но forloop уже завершен.

...