- ベストアンサー
デバッグについて
javacコマンドにて問題なくコンパイルされるのに実際動かすとどうにも動かなくなるときには、デバッグは役に立つのですか。初心者なのでできるだけ丁寧に教えてください。よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>自分で書いたプログラムの中でほかのclassのメソッドを使って部分がおかしいことが解っているのですが、そのメソッド内のどこがおかしいのか解る方法を是非教えていただきたいのですが。 一番古典的ですが簡単・確実なものは、「ログを残す」という方法です。 ・・・といっても、java.io.Fileを使うわけでなく、System.out.println() を使用します。 例えばこんな感じで。。。 class Test { public static void main(String args[]) { int[] a = {1,2,3}; System.out.println("For Debug 1"); a[1] = 4; System.out.println("For Debug : a[1]=" + a[1]); System.out.println(a[5]); System.out.println("For Debug : finish !!"); } } こうすると、「For Debug : a[1]=4」という出力を最後にエラーになります。 ・・・ということは、エラーはそれ以降に存在するわけです。 始めは適当な位置に2~3個入れておいて、少しずつ細かくしてください。 そうすると、エラーが発生した箇所にたどり着けます。 また、ログ内容によって、こんなことも分かります。 ・同じ出力が何度も無意味に表示 ⇒ 予想外のループの発生 ・分岐後の出力がおかしい ⇒ 分岐の問題 ・変数の値がおかしい ⇒ 途中の処理に誤りがある 他には・・・例外についての知識はありますか? システムのダウンが例外の発生によるものでしたら、try~catch~finallyで対処できます。 このとき、例外の内容を出力させると、「どこのファイルのどの行で例外が発生しているのか」が分かります。 (例外の内容出力 : printStackTrace() を使う) 上のプログラムの場合、こんな表示がコマンドプロンプト上に表示されます。 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException at Test.main(Test.java:7) これは、「Test.javaのmain() で、java.lang.ArrayIndexOutOfBoundsExceptionという例外が発生したよ!例外の発生場所はTest.javaの7行目だよ!」という意味です。 こんな感じで例外の発生場所を特定してください。 例外の知識は非常に重要であるため、どの参考書にも載っているはずです。 そちらを参考にしてみてください。
その他の回答 (1)
- po-net
- ベストアンサー率36% (172/477)
デバッグとは、「バグをなくす」ことです。 つまり、コンパイルが通って、実際に動かない(もしくはエラーになる)のを何とかする行為のことです。 なぜこんなことが必要になるかというと、「コンパイルとは、プログラムの文法上間違いでなければ通ってしまう」という、決定的な問題があります。 例えば、こんな感じです。 class Test { public static void main(String args[]) { int[] a = {1,2,3}; a[1] = 4; System.out.println(a[5]); } } このプログラムは文法上の間違いはありません。 ですからコンパイルは通ります。 しかし、5行目では配列aの、存在しない場所を示していますね。 ですから、java.lang.ArrayIndexOutOfBoundsException という、エラー(例外)が発生します。 実際にやってみてください。 これが動作上の問題であり、 >問題なくコンパイルされるのに実際動かすとどうにも動かなくなるとき ということなのです。 ですから、プログラマーの間では、コンパイルが通ったからといって、プログラムが完成したとはいえないのが通説です。 だから動作テストというものが発生するんです。 動作テストを行って、いろんな処理をさせるうちに「例外の発生」などの予想外の処理結果が出たりします。 コレがバグであり、バグをなくして正常な動作をするようにプログラム変更する処理がデバッグなのです。 ですから、デバッグなくしてプログラムは存在しないと考えた方が良いでしょう。 こんなところでしょうか。 他に何かあれば質問してください。
補足
大変わかりやすい返事で目から鱗が落ちました。本当にありがとうございます。早速参考書をみてやってみたのですが、まずはじめにjavac -g ファイル名.javaと打ち込みその後jdb ファイル名 | moreと打ち込みました。 すると動作はするのですが、その後どのようにしていいのかわかりません。自分で書いたプログラムの中でほかのclassのメソッドを使って部分がおかしいことが解っているのですが、そのメソッド内のどこがおかしいのか解る方法を是非教えていただきたいのですが。よろしくお願い致します。
お礼
大変ありがとうございました。実際に試してみたらうまくいきました。2週間以上もわからなかった問題点がすぐにわかるようになり、本当に感謝しております。これからもわからないところが出てきた際にはよろしくお願いいたします。本当にありがとうございました。