ArrayIndexoutOfBoundSexception não está sendo pego e ignorado
-
20-09-2019 - |
Pergunta
Quero pegar e ignorar e ArrayIndexoutOfBoundSexception Erro (basicamente não é algo que eu tenho controle, então preciso do meu programa para continuar o Rushging).
No entanto, meu par de tentativas/captura não parece pegar a exceção e ignorá -lo. Espero que você possa escolher o que estou fazendo de errado.
A exceção ocorre nesta linha
content = extrator.getTextFrompage (página);
Aqui está o meu 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");
}
}
Exceção em thread "main" java.lang.arrayIndexoutOfBoundSexception: Índice inválido: 02 em com.lowagie.text.pdf.cmapawaredocumentfont.decodesingleCid (fonte desconhecida) em com.lowagie.text.pdf.cmapawaredocentfument) .lowagie.text.pdf.parser.PdfContentStreamProcessor.decode(Unknown Source) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor.displayPdfString(Unknown Source) at com.lowagie.text.pdf.parser.PdfContentStreamProcessor$ShowText.invoke (Fonte desconhecida) em com.lowagie.text.pdf.parser.pdfcontentstreamprocessor.invokeoperator (fonte desconhecida) em com.lowagie.text.pdf.parser.pdfcontentstreamprocessor.processContent (soubro) em com.lowagie .Pdftextextractor.getTextFrompage (fonte desconhecida) em com.pdfextractor.main.extractor.main (extrator.java:64)
editar: Eu coloquei a tentativa/captura no loop for
e adicionou o rastreamento da pilha
e Índice removido = 1
Solução
Pergunta estúpida, mas a ArrayIndexoutfBoundSexception que você coloca no mesmo pacote que o que está sendo jogado? ou seja, java.lang
Ou talvez Catch Throwable para ver se isso funciona.
Outras dicas
É possível que o código que você está chamando esteja lidando com o ArrayIndexOutOfBoundsException
e imprimindo o traço da pilha por conta própria sem remontá -la. Se for esse o caso, você não veria o seu System.out.println
chamado.
Editar: se você quiser continuar rindo, seria bom saber que o PDFContentStreamProcessor#processContent
vai pegar o ArrayIndexOutOfBoundsException
e depois jogue uma instância de seu com.lowagie.text.ExceptionConverter
, que é uma subclasse de RuntimeException
.
Talvez este seja um acéfalo (afinal, estou correndo em 3 horas de sono nas últimas 36 horas), mas na linha do que Digiarnie e Ankur mencionaram: você já tentou simplesmente catch (Exception e)
?
Definitivamente não é o ideal, pois obviamente (junto com o Throwable t
sugestão) captará todas as exceções sob o sol, não limitadas a ArrayOutOfBoundsException
. Apenas pensei na ideia lá fora, se você ainda não tentou.
Em vez de usar essa exceção, você deve corrigir seu código para não passar pelos limites da matriz!
A maioria das matrizes conta de 0 até a Array.Length-1
Se você substituir o seu loop por isso, isso pode evitar todo o problema:
for (int page = 0;page < noPages;page++){
Você precisa da tentativa/captura para estar dentro do forloop. O controle aparece para a pegada, os incêndios e retoma o controle posteriormente, mas o forloop já foi encerrado.
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");
}
}
Talvez seja uma pergunta boba ... você tem certeza de que a exceção é lançada no código que você postou e não em um método diferente?
O programa deveria ter funcionado. Você deve fornecer mais detalhes, incluindo o nome da sua classe. Você pode tentar pegar exceção ou colocar um bloco finalmente com um pouco de POP.
Isso é estranho - na verdade, eu dei uma olhada na fonte do Itext no método de que a exceção é lançada (cmapawaredocumentfont.decodesinglecid) e parece que:
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");
}
O ArrayIndexoutOfBoundSexception que joga é o Java padrão. Não consigo ver nenhum motivo pelo seu try-capath original não funcionando.
Talvez você deva postar a turma inteira? Além disso, qual versão do iText você está usando?
Espere um segundo! Você está perdendo alguns aparelhos lá :) Sua declaração de captura está fora da sua declaração para para! Você tem isto:
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");
}
}
Deveria 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