Вопрос

Я хочу перехватить и проигнорировать ошибку ArrayIndexOutOfBoundsException (по сути, это не то, что я могу контролировать, поэтому мне нужно, чтобы моя программа продолжала работать).

Однако моя пара try / catch, похоже, не улавливает исключение и не игнорирует его.Надеюсь, вы сможете понять, что я делаю не так.

Исключение возникает в этой строке

content = extractor.getTextFromPage(страница);

Вот мой код:

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.CMAP был предоставлен документ с идентификатором шрифта.decodeSingleCID(Неизвестный источник) на com.lowagie.text.pdf.CMAP был представлен документ, который можно расшифровать (Неизвестный источник) в com.lowagie.text.pdf.parser.PdfContentStreamProcessor.decode(Неизвестный источник) в 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)

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

Это было полезно?

Решение

Глупый вопрос, но является ли ArrayIndexOutOfBoundsException, которое вы вставили в catch, из того же пакета, что и выбрасываемый?т. е.java.lang

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

Другие советы

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

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

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

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

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

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

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

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 или поместить в него блок finally с некоторым s.o.p.

Это странно - я действительно взглянул на источник 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 вы используете?

Подождите секунду!У вас там не хватает каких-то фигурных скобок :) Ваш оператор 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top