4

私 (Java 初心者) は、Eclipse (SourceForge からダウンロードしたプロジェクト) で Java プログラムを実行しています。デバッグすると、50 行の try ブロックの後に発生する、常にこの場所で終了します。

catch (Exception ex){
    System.err.println("PROCESSING ERROR: " + ex.getMessage());
    helpFormatter.printHelp(usage, options);
}

この例外をトリガーするコード行を見つけてデバッグするにはどうすればよいですか? (つまり、行番号を調べたり、ローカル変数を調べたり、式を評価したりします。) キャッチの後にブレークポイントを配置すると、元のエラーに戻る方法や、少なくとも行番号を見つける方法がわかりません。try ブロック内のコードをステップ実行することもできますが、多くのループがあるため、非常に時間がかかる可能性があります。

どうすればこれをデバッグできますか?

4

6 に答える 6

4

スタックトレースを見てください。Eclipse タブのどこかで見つけることができます。または、例外をキャッチしたときに直接印刷することもできます。

catch (Exception ex){
    ex.printStackTrace();
}

スタックトレースを検査することは、エラーをすばやく見つけるための最も安全で高速な方法です。ブレークポイントを設定したとしても (または最悪の場合、実行された最後のステートメントを見つけるためにいくつかの印刷を使用しても)、例外が発生した場所を正確に特定することはできません。実際、ブレークポイントの後に呼び出された最初のメソッドではなく、呼び出しスタック内のより深いところで例外が発生した可能性があります。

于 2012-08-05T23:06:03.257 に答える
3

「例外ブレークポイント」を追加します。問題が最初に発生した例外の根本原因で停止します。

まず、スローされている特定の例外のタイプを判別します。これを行うには、catchブロック内にブレークポイントを設定し、exがどのような種類の例外であるかを確認します(変数ウィンドウで確認します)。ブレークポイントを削除し、F8キーを押して続行します。

次に、例外ブレークポイントを追加します。これは、ブレークポイントビューに移動し、「J!」のようなアイコンをクリックすることで実行されます。あなたが例のために見た特定のタイプを指定してください。ここでコードを実行すると、例外がスローされた時点で停止するはずです。

別の注意点:一般的に、単に例外をキャッチすることはお勧めできません。特定のタイプをキャッチしようとする方がよいでしょう。ただし、あなたが言ったように、それはコードではありません。

于 2012-08-07T01:15:22.297 に答える
1

try ブロックの先頭にブレークポイントを設定すると、デバッグ ビューで、関心のあるすべての詳細 (行番号、ローカル変数の検査、式の評価など) を確認できます。

于 2012-08-05T23:07:25.180 に答える
1

try ブロックの最初の行にブレークポイントを置き、catch ブロックにジャンプするまで次の行に進みます。次に、その行で例外が発生したことがわかります。次に、例外を調べて、何が問題なのかを確認できます。「戻る」ことはできないため、問題の原因を確認するために再度デバッグすることになるでしょう。

しかし、ほとんどの場合、スタック トレースに示されている行を確認するだけで十分です。状態を調べたい場合は、この行にブレークポイントを配置できます。

于 2012-08-05T23:08:50.470 に答える
0

try/catch ブロックを一時的に削除して、デバッガーが例外で停止するようにすることができます。throws Exception(ごまかして、メソッド シグネチャに追加する必要があるかもしれません。)

于 2012-08-05T23:46:55.733 に答える
-1

私にとって最適なデバッグ ソリューションは、主要なコード ブロックごとに複数の Print ステートメントを配置することです。

System.out.println("1");

//Code1 block

System.out.println("2");

//code 2 block

System.out.println("3");

//code 3 block

System.out.println("4");

こうすることで、最後に実行され、変更された print ステートメントがどれかを確認できます。最後に出力された数字と、catch ステートメントのスタック トレースが役立ちます。

于 2012-08-05T23:08:48.950 に答える