Domanda

voglio prendere e ignorare ed errore ArrayIndexOutOfBoundsException (in pratica non è qualcosa che ho il controllo su, quindi ho bisogno del mio programma per tenere chugging lungo).

Tuttavia la mia coppia di try / catch non sembra intercettare l'eccezione e ignorarlo. Speriamo che si può scegliere quello che sto facendo male.

L'eccezione si verifica in questa linea

  

content = extractor.getTextFromPage (pagina);

Qui è il mio codice:

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

Eccezione in filetto java.lang.ArrayIndexOutOfBoundsException "main": Indice non valido: 02     a com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID (fonte sconosciuta)     a com.lowagie.text.pdf.CMapAwareDocumentFont.decode (fonte sconosciuta)     a com.lowagie.text.pdf.parser.PdfContentStreamProcessor.decode (fonte sconosciuta)     a com.lowagie.text.pdf.parser.PdfContentStreamProcessor.displayPdfString (fonte sconosciuta)     a com.lowagie.text.pdf.parser.PdfContentStreamProcessor $ ShowText.invoke (fonte sconosciuta)     a com.lowagie.text.pdf.parser.PdfContentStreamProcessor.invokeOperator (fonte sconosciuta)     a com.lowagie.text.pdf.parser.PdfContentStreamProcessor.processContent (fonte sconosciuta)     a com.lowagie.text.pdf.parser.PdfTextExtractor.getTextFromPage (fonte sconosciuta)     a com.pdfextractor.main.Extractor.main (Extractor.java:64)

Modifica Ho messo il try / catch all'interno del ciclo for
e ha aggiunto lo stack trace
e rimosso index = 1

È stato utile?

Soluzione

Domanda stupida, ma è l'ArrayIndexOutOfBoundsException che si mette nella cattura dallo stesso pacchetto come quello che viene gettato? cioè java.lang

O forse prendere throwable per vedere se funziona ancora.

Altri suggerimenti

E 'possibile che il codice che si sta chiamando è la gestione della ArrayIndexOutOfBoundsException e stampare la traccia dello stack da solo senza rethrowing esso. Se questo è il caso, non si vedrebbe il tuo System.out.println chiamato.

EDIT: Se si desidera mantenere chugging lungo, sarebbe bene sapere che il PDFContentStreamProcessor#processContent prenderà i ArrayIndexOutOfBoundsException e poi gettare un'istanza della sua com.lowagie.text.ExceptionConverter , che è una sottoclasse di RuntimeException.

Forse questo è un gioco da ragazzi (dopo tutto, sto correndo su 3 ore di sonno nelle ultime 36 ore), ma sulla falsariga di ciò che digiarnie e Ankur detto: Hai provato semplicemente catch (Exception e)

Non è sicuramente l'ideale, dato che ovviamente è (insieme con il suggerimento Throwable t) sarà catturare ogni eccezione sotto il sole, non limitato ai ArrayOutOfBoundsException. Basta il pensiero idea là fuori, se non avete ancora provato.

Invece di usare questa eccezione, si dovrebbe risolvere il codice in modo che non si va confini matrice passato!

La maggior parte delle matrici di contare da 0 fino a Array.length-1

Se si sostituisce il ciclo for con questo, si potrebbe questo evita l'intera questione:

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

è necessario il try / catch per essere all'interno del ciclo for. il controllo si apre verso il tentativo di cattura, i fuochi di cattura, e riprende il controllo in seguito, ma il ciclo è già stato terminato.

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

Forse questa è una domanda stupida ... Sei sicuro che l'eccezione viene generata nel codice che avete inviato e non in un metodo differen?

Il programma dovrebbe aver funzionato. Si dovrebbe dare maggiori dettagli, tra cui il nome della classe. Si può provare con la cattura Exception o di mettere un blocco finally con qualche s.o.p in esso.

Questo è strano - in realtà ho dato un'occhiata alla fonte di itext nel metodo l'eccezione viene generata da (CMapAwareDocumentFont.decodeSingleCID) e sembra che questo:

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

L'ArrayIndexOutOfBoundsException getta è lo standard Java uno. Non riesco a vedere qualsiasi motivo il try-catch originale non funziona.

Forse si dovrebbe inviare tutta la classe? Inoltre, la versione di iText stai usando?

Aspetta un secondo! Vi state perdendo alcune coppie in là :) il pescato affermazione è fuori della vostra istruzione for! Hai questo:

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

Dovrebbe essere:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top