私は常にSystem.out.println(...)
を使用してコードをデバッグします。どの場合にEclipseを使用しますかJavaデバッガ?私はそれを使用する必要がなく、小さなバグシンボルがまだ少し不思議です。デバッガが私を助けることができるケースがありますか? printlnで解決しませんか?
すべての場合...
確かに、Java IDEについては100%確信がありません(Java IDEと一致しない修正があれば歓迎します)。VisualStudioを使用しているためです。) C#/ F#を超えていますが、監視リストに変数を追加し、条件付きブレークを使用すると、println ...
そして、地獄、私はデバッガーでさえすばらしくありません、しかしそれはまだ光年コンソールのデバッグまたはログを掘り下げる前です。
Printlnデバッグの問題は、println自体に問題があることです。
println
を使用してデバッグしているときは、コードを変更する必要があります。これは、デバッグを開始する前にバグがどこにあるかをすでに知っているか、少なくともかなり良いアイデアを持っている必要があることを意味します。そして、もしあなたがすでにそれを知っているなら、おそらく少なくともデバッグする必要はないでしょう。(少なくとも)IMEのデバッグの理由は、バグを修正する方法を理解するのではなく、バグの場所を見つけることです。バグを突き止めると、通常は解決策がコンテキストから明白になります。 (もちろん、常にというわけではありませんが、通常はです。)
Println診断で有用な情報が得られない、または十分の情報が得られない場合は、プログラムを閉じて、コードを変更し、再コンパイルして、元に戻す必要があります。バグを再現するのに要したところまで。
バグの発見と修正が完了したら、printlnステートメントを削除するためにコードを再度変更する必要があります。 (お見逃しなく、デバッグ出力を残したまま製品を出荷してください!)
対話型デバッガにはこれらの問題はありません。何を探しているのかを事前に知る必要はありません。スコープ内であればいつでも任意の変数の値を調べることができます。デバッガーはプログラムの外部にあるため、コードを変更する必要はありません。そのため、デバッグを停止してコードを変更し、再コンパイルして新しいものを確認する必要はありません。
手動でインストルメントする(そしてインストルメントを外す)代わりに、コードを外部から検査するという原則だけが、インタラクティブデバッガーが最近のプログラマーの間で好まれるデバッグ方法となっている理由です。
デバッガーがprintステートメントを介して得ることができなかったという情報は実際にはありませんbut ...
非常に高速で柔軟性があります。 コードの実行中にコードが何をしているかを自由に見ることができるときに得られる力を言葉で説明することはできません。
概して、デバッガを使用すると、通常、デバッグプロセスが10倍高速になると推測します。 1つの印刷ステートメントが次の場所に関する情報を提供するとき(つまり、別の印刷ステートメントを追加する場所)とその新しい印刷ステートメントの出力が表示されるときの間に長いビルドまたはデプロイメントがある場合は、おそらく100回です。デバッガーでは、必要なのはシングルクリック、おそらく0.5秒です。完全な再構築とアプリサーバーへのデプロイを行う必要がある場合、30分かかる可能性があります。
私の経験では、Eclipseデバッガー(または、任意の段階的なデバッガー)は、printlnステートメントよりもはるかに役立ちます。
(これらは私が見つけた最も基本的な利点です)
ただし、デバッガーは必ずしもそうではありません。
つまり、小さくて使いやすいプロジェクトでは、デバッガが一番の友です。大規模なプロジェクト(多くの人と一緒に作業することが多い)の場合、大規模な書き込み時間のロギングは、さらに大きな味方です。または少なくとも私のもの。
最初にググったほうがいい。 Eclipseのデバッガーには、定義する必要のない多くの関数がすでに含まれています。それ以外の場合、System.out.println()ステートメントは単純な小さなプロジェクトでは役立つかもしれませんが、多くのメンバーが作業しているプロジェクトや多数のファイルがあるプロジェクトでは、これらのステートメントを追加し続けることができません。ブレークポイントがあるのは良いことです。
this をご覧になることをお勧めします
デバッガが必要なことはほとんどわかりませんが、必要なときに本当に必要です。
厄介なケースの1つは、println
を使用してオブジェクトを出力し、「null」を出力する場合です。年齢を問わずコードを見つめた後、その時点でオブジェクトcannotがnullであることを確信しています。それでも、それがprintln
が言うことです。これは時間を浪費する可能性があります。
デバッガーでは、オブジェクトがnull
ではないことがすぐにわかります。ただし、toString()
メソッドは、そのオブジェクトの一部のフィールドの値を出力するようにオーバーライドされています。もちろん、このフィールドの値はnull
です。
デバッガーを使用すると、println
を使用するよりも幅広い質問をすばやく検索できます。しかし、多くの単純な状況では、println
で十分です。十分でない場合は、時間を無駄にしないでください。