Pregunta

Quiero coger y hacer caso omiso y error ArrayIndexOutOfBoundsException (básicamente, no es algo que tengo control sobre, por lo que necesita mi programa para resoplando).

Sin embargo, no parece que mi par try / catch para detectar la excepción e ignorarlo. Esperamos que usted puede elegir lo que estoy haciendo mal.

La excepción se produce en esta línea

  

content = extractor.getTextFromPage (página);

Aquí está mi código:

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

Excepción en hilo java.lang.ArrayIndexOutOfBoundsException "principal": índice no válido: 02     en com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID (origen desconocido)     en com.lowagie.text.pdf.CMapAwareDocumentFont.decode (origen desconocido)     en com.lowagie.text.pdf.parser.PdfContentStreamProcessor.decode (origen desconocido)     en com.lowagie.text.pdf.parser.PdfContentStreamProcessor.displayPdfString (origen desconocido)     en com.lowagie.text.pdf.parser.PdfContentStreamProcessor $ ShowText.invoke (origen desconocido)     en com.lowagie.text.pdf.parser.PdfContentStreamProcessor.invokeOperator (origen desconocido)     en com.lowagie.text.pdf.parser.PdfContentStreamProcessor.processContent (origen desconocido)     en com.lowagie.text.pdf.parser.PdfTextExtractor.getTextFromPage (origen desconocido)     en com.pdfextractor.main.Extractor.main (Extractor.java:64)

editar: I han puesto el try / catch dentro del bucle for
y añadido el seguimiento de pila
y eliminado index = 1

¿Fue útil?

Solución

Una pregunta estúpida, pero es la ArrayIndexOutOfBoundsException que se pone en la captura del mismo paquete que el que está siendo lanzada? es decir java.lang

O tal vez coger throwable para ver si eso aún funciona.

Otros consejos

Es posible que el código que está llamando es el manejo de la ArrayIndexOutOfBoundsException y la impresión de la traza de la pila por sí sola sin Regeneración de ella. Si ese es el caso, usted no ve su System.out.println llama.

EDIT: Si desea mantener resoplando, sería bueno saber que la PDFContentStreamProcessor#processContent alcanzará los ArrayIndexOutOfBoundsException y luego emitir una instancia de su com.lowagie.text.ExceptionConverter , que es una subclase de RuntimeException.

Tal vez esto es una obviedad (después de todo, estoy corriendo en 3 horas de sueño en las últimas 36 horas), pero a lo largo de las líneas de lo digiarnie y Ankur mencionó: ¿Ha intentado simplemente catch (Exception e)

Definitivamente no es ideal, ya que, obviamente, (junto con la sugerencia Throwable t) se captura toda excepción bajo el sol, no se limita a ArrayOutOfBoundsException. Sólo pensé idea por ahí si no se ha probado todavía.

En lugar de utilizar esta excepción, debe fijar su código de manera que usted no va límites de matriz últimos!

La mayoría de las matrices cuentan desde 0 hasta Array.length-1

Si reemplaza el bucle for con esto, es posible que esto evita toda la cuestión:

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

que necesita el try / catch para estar dentro del bucle. se sale de control al intento de captura, los fuegos de captura, y reanuda el control después, pero el bucle ya se ha terminado.

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

Tal vez esta es una pregunta tonta ... ¿Estás seguro de que la excepción en el código que envió y no en un método diferen?

El programa debería haber funcionado. Debe dar más detalles, incluyendo el nombre de la clase. Usted puede tratar por la captura de excepción o poniendo un bloque finally con un poco de s.o.p en ella.

Esto es extraño - en realidad tenía un vistazo a la fuente de itext en el método de la excepción desde (CMapAwareDocumentFont.decodeSingleCID) y se ve así:

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

El ArrayIndexOutOfBoundsException que arroja es el estándar de Java uno. No puedo ver ninguna razón su try-catch original no trabaja.

Tal vez usted debe enviar toda la clase? Además, la versión de itext está usando?

Espera un segundo! Que faltan algunos apoyos allí :) Su estado de captura es de fuera de su declaración! Tiene la siguiente:

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

Debe ser:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top