5

ArrayIndexOutOfBoundsException エラーをキャッチして無視したい (基本的に、これは私が制御できるものではないため、プログラムを動かし続ける必要があります)。

ただし、私の try/catch ペアは例外をキャッチして無視しているようには見えません。うまくいけば、私が間違っていることを選択できます。

この行で例外が発生します

content = extractor.getTextFromPage(ページ);

これが私のコードです:

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

スレッド「メイン」の例外 java.lang.ArrayIndexOutOfBoundsException: 無効なインデックス: 02 com.lowagie.text.pdf.CMapAwareDocumentFont.decodeSingleCID (不明なソース) com.lowagie.text.pdf.CMapAwareDocumentFont.decode (不明なソース) で com .lowagie.text.pdf.parser.PdfContentStreamProcessor.decode (不明なソース) com.lowagie.text.pdf.parser.PdfContentStreamProcessor.displayPdfString (不明なソース) com.lowagie.text.pdf.parser.PdfContentStreamProcessor$ShowText.invoke (不明なソース) com.lowagie.text.pdf.parser.PdfContentStreamProcessor.invokeOperator (不明なソース) com.lowagie.text.pdf.parser.PdfContentStreamProcessor.processContent (不明なソース) com.lowagie.text.pdf.parser com.pdfextractor.main.Extractor.main(Extractor.java:64) の .PdfTextExtractor.getTextFromPage(不明なソース)

編集: for ループ内に try/catch を配置し
、スタック トレースを追加して
index=1 を削除しました

4

10 に答える 10

4

呼び出しているコードがArrayIndexOutOfBoundsException、スタック トレースを再スローせずに独自に処理して出力している可能性があります。その場合は、自分がSystem.out.println呼び出されたことを確認できません。

編集: 一緒にやり続けたい場合は、PDFContentStreamProcessor#processContentが をキャッチし、 のサブクラスであるArrayIndexOutOfBoundsExceptionのインスタンスをスローすることを知っておくとよいでしょう。com.lowagie.text.ExceptionConverterRuntimeException

于 2009-11-18T05:26:21.210 に答える
3

たぶんこれは簡単なことですが(結局のところ、私は過去36時間で3時間の睡眠で走っています)、digiarnieとAnkurが述べたことに沿って:あなたは単純に試しましたcatch (Exception e)か?

Throwable t明らかにそれは(提案とともに)太陽の下ですべての例外をキャッチするので、それは間違いなく理想的ではありませんArrayOutOfBoundsException。まだ試していない場合は、アイデアを考えてみてください。

于 2009-11-18T05:45:31.933 に答える
3

ばかげた質問ですが、スローされたものと同じパッケージからのキャッチに入れられた ArrayIndexOutOfBoundsException ですか? つまり、java.lang

または、おそらく throwable をキャッチして、それが機能するかどうかを確認します。

于 2009-11-18T05:23:06.270 に答える
1

この例外を使用する代わりに、配列の境界を超えないようにコードを修正する必要があります。

ほとんどの配列は0からarray.length-1までカウントされます

forループをこれに置き換えると、問題全体を回避できる可能性があります。

for (int page = 0;page < noPages;page++){
于 2009-11-18T05:09:04.440 に答える
0

try/catchをforloop内に配置する必要があります。コントロールがtrycatchにポップアウトし、catchが起動し、その後コントロールを再開しますが、forloopはすでに終了しています。

于 2009-11-18T05:06:37.330 に答える
0
    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");
        }
    }
于 2009-11-18T05:10:27.187 に答える
0

これは奇妙です - 私は実際に例外がスローされたメソッド (CMapAwareDocumentFont.decodeSingleCID) で itext のソースを見て、次のように見えました:

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

それがスローする ArrayIndexOutOfBoundsException は、標準の Java のものです。元の try-catch が機能しない理由がわかりません。

おそらく、クラス全体を投稿する必要がありますか?また、どのバージョンの itext を使用していますか?

于 2009-11-18T07:47:23.783 に答える
0

おそらくこれはばかげた質問です...別のメソッドではなく、投稿したコードで例外がスローされますか?

于 2009-11-18T06:32:40.123 に答える
0

一瞬待って!そこにいくつかの中かっこがありません:) catch ステートメントが for ステートメントの外にあります! あなたはこれを持っています:

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

そのはず:

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
于 2009-11-18T07:51:27.067 に答える
0

プログラムは機能するはずです。クラス名を含む詳細を提供する必要があります。Exception をキャッチするか、何らかの SOP を含む finally ブロックを配置して試すことができます。

于 2009-11-18T06:56:59.343 に答える