Frage

Ich möchte fangen und ignorieren und ArrayIndexOutOfBoundsException Fehler (im Grunde ist es nicht etwas, das ich Kontrolle darüber haben, so dass ich mein Programm brauchen tuckern zusammen zu halten).

Allerdings meine try / catch Paar scheint nicht die Ausnahme zu fangen und sie zu ignorieren. Hoffentlich können Sie auswählen, was ich falsch mache.

Die Ausnahme tritt bei dieser Zeile

  

content = extractor.getTextFromPage (Seite);

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

Ausnahme im Thread "main" java.lang.ArrayIndexOutOfBoundsException: Ungültiger Index: 02     bei com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID (Unknown Source)     bei com.lowagie.text.pdf.CMapAwareDocumentFont.decode (Unknown Source)     bei com.lowagie.text.pdf.parser.PdfContentStreamProcessor.decode (Unknown Source)     bei com.lowagie.text.pdf.parser.PdfContentStreamProcessor.displayPdfString (Unknown Source)     bei com.lowagie.text.pdf.parser.PdfContentStreamProcessor $ ShowText.invoke (Unknown Source)     bei com.lowagie.text.pdf.parser.PdfContentStreamProcessor.invokeOperator (Unknown Source)     bei com.lowagie.text.pdf.parser.PdfContentStreamProcessor.processContent (Unknown Source)     bei com.lowagie.text.pdf.parser.PdfTextExtractor.getTextFromPage (Unknown Source)     bei com.pdfextractor.main.Extractor.main (Extractor.java:64)

bearbeiten: Ich habe die try / catch innerhalb der for-Schleife
setzen und die Stack-Trace Karten und entfernten Index = 1

hinzugefügt
War es hilfreich?

Lösung

Dumme Frage, aber ist die ArrayIndexOutOfBoundsException, dass Sie in dem Fang aus dem gleichen Paket geschnürt wie derjenige geworfen zu werden? das heißt java.lang

Oder vielleicht throwable fangen, wenn das auch Werke zu sehen.

Andere Tipps

Es ist möglich, dass der Code, dass Sie den Aufruf den ArrayIndexOutOfBoundsException ist die Handhabung und das Drucken den die Stack-Trace auf seinem eigenen, ohne es zu Erneutes Auslösen. Wenn das der Fall ist, würden Sie nicht sehen Ihre System.out.println genannt.

EDIT: Wenn Sie tuckern entlang behalten wollen, wäre es gut zu wissen, dass die PDFContentStreamProcessor#processContent die ArrayIndexOutOfBoundsException fangen und dann eine Instanz der com.lowagie.text.ExceptionConverter , die eine Unterklasse von RuntimeException ist.

Vielleicht ist das ein Kinderspiel (immerhin bin ich in den letzten 36 Stunden 3 Stunden Schlaf läuft), sondern nach dem Vorbild dessen, was digiarnie und Ankur erwähnt: haben Sie versucht einfach catch (Exception e)

Es ist definitiv nicht ideal, da es offensichtlich (zusammen mit dem Throwable t Vorschlag) wird jede Ausnahme unter der Sonne fangen, nicht zu ArrayOutOfBoundsException beschränkt. Ich dachte, Idee da draußen, wenn Sie es noch nicht versucht haben.

Anstatt diese Ausnahme verwenden, sollten Sie Ihren Code beheben, so dass Sie nicht über Array-Grenzen gehen Sie!

Die meisten zählen Arrays von 0 bis Array.length-1

Wenn Sie Ihre for-Schleife mit diesem ersetzen, könnte man dies vermeidet die gesamte Ausgabe:

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

müssen Sie die try / catch innerhalb der for-Schleife sein. Kontrolle herausspringt auf die Try-Catch, den Fang Feuer und nimmt Kontrolle danach, aber die for-Schleife bereits abgeschlossen ist.

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

Vielleicht ist dies eine dumme Frage ... Sind Sie sicher, dass die Ausnahme im Code ausgelöst wird, Sie auf dem Laufenden und nicht in einem differen Methode?

Das Programm sollte gearbeitet haben. Sie sollten mehr Details einschließlich Ihrer Klassennamen geben. Sie können versuchen, Exception fangen oder ein schließlich mit einigen s.o.p darin blockieren setzen.

Das ist seltsam - ich hatte tatsächlich einen Blick auf itext der Quelle in dem Verfahren die Ausnahme von (CMapAwareDocumentFont.decodeSingleCID) ausgelöst wird, und es sieht wie folgt aus:

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

Die ArrayIndexOutOfBoundsException es wirft, ist der Standard ein Java. Ich kann nicht sehen keinen Grund, Ihr ursprüngliches try-catch nicht funktioniert.

Vielleicht sollten Sie die gesamte Klasse posten? Auch, welche Version von itext sind Sie mit?

Warten Sie eine Sekunde! Sie fehlen einige Klammern drin :) Ihre catch-Anweisung ist vor der für Aussage! Sie haben dies:

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

Es sollte sein:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top