Question

Je veux attraper et ignorer et erreur ArrayIndexOutOfBoundsException (essentiellement ce n'est pas quelque chose que j'ai le contrôle sur, donc je besoin de mon programme pour maintenir cahin-caha).

Cependant ma paire try / catch ne semble pas attraper l'exception et l'ignorer. Nous espérons que vous pouvez choisir ce que je fais mal.

L'exception se produit à cette ligne

  

content = extractor.getTextFromPage (page);

Voici mon code:

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

Exception dans le thread "principal" java.lang.ArrayIndexOutOfBoundsException: index non valide: 02     à com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID (Source inconnue)     à com.lowagie.text.pdf.CMapAwareDocumentFont.decode (Source inconnue)     à com.lowagie.text.pdf.parser.PdfContentStreamProcessor.decode (Source inconnue)     à com.lowagie.text.pdf.parser.PdfContentStreamProcessor.displayPdfString (Source inconnue)     à com.lowagie.text.pdf.parser.PdfContentStreamProcessor $ ShowText.invoke (Source inconnue)     à com.lowagie.text.pdf.parser.PdfContentStreamProcessor.invokeOperator (Source inconnue)     à com.lowagie.text.pdf.parser.PdfContentStreamProcessor.processContent (Source inconnue)     à com.lowagie.text.pdf.parser.PdfTextExtractor.getTextFromPage (Source inconnue)     à com.pdfextractor.main.Extractor.main (Extractor.java:64)

modifier: J'ai mis le try / catch dans le boucle
et a ajouté la trace de la pile et l'indice
retiré = 1

Était-ce utile?

La solution

question stupide, mais est le ArrayIndexOutOfBoundsException que vous mettez dans les prises du même paquet que celui d'être jeté? à savoir java.lang

Ou peut-être attraper throwable pour voir si cela fonctionne même.

Autres conseils

Il est possible que le code que vous appelez est la manipulation de la ArrayIndexOutOfBoundsException et l'impression de la trace de la pile sur lui-même sans rethrowing il. Si tel est le cas, vous ne voyez pas votre System.out.println appelé.

EDIT: Si vous voulez garder cahin-caha, il serait bon de savoir que le PDFContentStreamProcessor#processContent attraperez le ArrayIndexOutOfBoundsException puis lancer une instance de son com.lowagie.text.ExceptionConverter , qui est une sous-classe de RuntimeException.

Peut-être cela est une évidence (après tout, je suis en cours d'exécution sur 3 heures de sommeil au cours des 36 dernières heures), mais le long des lignes de ce digiarnie et Ankur mentionné: avez-vous essayé simplement catch (Exception e)

Il est certainement pas idéal, car il est évident qu'il (ainsi que la suggestion de Throwable t) va attraper toutes les exceptions sous le soleil, ne se limite pas à ArrayOutOfBoundsException. Je pensais juste que là idée si vous ne l'avez pas encore essayé.

Au lieu d'utiliser cette exception, vous devez corriger votre code afin que vous n'allez pas les limites du tableau passé!

La plupart des tableaux comptent de 0 à array.length-1

Si vous remplacez votre boucle avec cela, vous pourriez cela évite toute la question:

for (int page = 0;page < noPages;page++){

vous avez besoin du try / catch être à l'intérieur de la boucle. le contrôle ressorte à la prise d'essai, les feux de capture, et reprend le contrôle après, mais la boucle est déjà terminée.

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

Peut-être est une question idiote ... Etes-vous sûr que l'exception est levée dans le code affiché et non dans une méthode différen?

Le programme aurait dû fonctionner. Vous devriez donner plus de détails, y compris le nom de votre classe. Vous pouvez en attrapant Exception ou de mettre un bloc finally avec quelques s.o.p en elle.

Ce qui est étrange - j'avais en fait un coup d'œil à la source de itext dans la méthode, l'exception est levée à partir (CMapAwareDocumentFont.decodeSingleCID) et il ressemble à ceci:

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

Le ArrayIndexOutOfBoundsException il lance est le Java standard. Je ne vois aucune raison pour votre original try-catch ne fonctionne pas.

Peut-être que vous devez envoyer toute la classe? En outre, la version de itext vous utilisez?

Attendez une seconde! Vous manquez quelques accolades là :) Votre déclaration est prise en dehors de votre déclaration pour! Vous avez ceci:

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

Il devrait être:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top