デバッグ |
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
デバッグ
プログラムのバグ(間違い)を直す事。
セッションではIDEの便利な機能を使って、
プログラムの間違いを探して直していきます。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
 |
|
 |
|
デバッグの基本
・エラーの種類 |
・エラーの原因 |
・エラーの調査 |
・IDEの基本のデバッグ機能の使い方 |
・バグの探し方 |
|
|
|
 |
|
 |
|
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
エラーの種類
主なエラーには、実行時エラーと
論理エラーの2種類がある。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
 |
|
エラーの種類
実行時エラー |
プログラムを実行した時に起こるエラー。
Javaランタイムからエラーメッセージが
出力され、プログラムは基本的に停止する。 |
論理エラー |
プログラムが想定した結果を出さないエラー。
Javaランタイムによるエラーメッセージは表示されず、プログラムは正常に実行される。
プログラムのアルゴリズムやロジックが
間違ってる場合に起こる。
原因が分かりにくい場合が多い。 |
|
|
|
 |
|
 |
|
|
|
別項目になっています。こちらからご覧下さい。
|
|
別項目になっています。こちらからご覧下さい。
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
エラーの原因
原因は大きく分けると3種類。
・コードの問題
・コード以外の問題
・複合的な問題
主な原因はコードの問題。
以下、順番にエラーの解決方法を見ていく。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
 |
|
エラーの原因
・ |
コードの問題(実行時エラー、論理エラー、または両方) |
・ |
コード以外の問題(パソコンの故障など) |
・ |
複合的な問題
(コードの複数箇所のエラー、コードとコード以外の複合エラーなど) |
|
|
|
 |
|
 |
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
1、エラーの原因がコードの問題の場合
実行時エラーの場合
Javaランタイムがエラーメッセージを出して、
おおよその原因を教えてくれるので、ある程度解決しやすい。
論理エラーの場合
考え方や作り方が間違っていたり勘違いが原因なので
原因を探すのが難しい場合が多い。
忘れている場合や思い込み。
そもそも、そのやり方を知らない場合もある。
例:計算問題で、掛け算のやり方で間違えてた場合。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
SESSION
7 で、ことがやった計算の間違え |
 |
|
 |
|
計算問題 |
|
計算の答えはいくつ? |
(2048 × (1024 + 1024)) - 8658 + 896 × 1024 = ??? |
|
|
詳しくはSESSION 7参照 |
|
|
「掛け算は、足し算引き算よりも先に計算しなければいけない」 |
|
ことは、この事を忘れていたため、正しい計算ができなかった。 |
|
掛け算のやり方を忘れてたら、何が間違いの原因か分からない。
論理エラーは、論理的な間違い以外にも、思い込みや
勘違いの場合もあるので原因究明に時間がかかる場合が多い。 |
|
|
|
 |
|
 |
|
|
|
 |
|
 |
|
コードの問題の例(実行時エラー) |
Javaの規定に違反したために起こったエラー
(書式が違う、言語仕様と違っていることをした、など) |
Javaの規定の限界を超えたために起こったエラー
(循環関数などでJavaの呼出限界を超えた場合、など) |
関数やAPI(ライブラリ)の使い方の間違いによるエラー
(引数の順番を間違えた、など) |
変数の使い方の間違いによるエラー |
設定の間違いによるエラー
(IDEの設定ファイルやJavaの起動時の引数などの設定ミス) |
|
|
コードの問題の例(論理エラー) |
考え方の間違い
(ロジックやアルゴリズム。処理を実行する順番がおかしいなど) |
知識不足 |
勘違い |
忘れている |
|
|
論理エラーによって、実行時エラーが引き起こさている場合など
複合している場合もある。 |
|
|
|
 |
|
 |
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
2、エラーの原因がコード以外の場合
機械が壊れていたり、OSの不具合が原因だったり。
OSやJavaをアップデートした時も注意すること。
つまり、コードを見てるだけじゃ解決しない場合がある。
いろいろ調査する必要がある。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
 |
|
コード以外の問題の例 |
Javaの不具合によるエラー |
OSの不具合によるエラー |
他のソフト(ライブラリなどを含む)の不具合によるエラー |
プログラムの実行環境によるエラー
(ライブラリのバージョンの違いや不足など) |
ハードウェアのエラー
(ハードディスクやメモリー、ネットワークカード、物理的な故障や
ドライバーの追加・変更によるものなど) |
上記の組み合わせによるエラー |
|
|
JavaやOSのアップデートやライブラリーの追加・変更、
新たな機器の接続やドライバーの追加・変更など・・・
今まで出ていなかったエラーが
開発環境の変更後に出た場合、注意する必要がある。 |
|
|
|
 |
|
 |
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
3、エラーの原因がエラーの複合の場合
同時に複数のエラーが起きている場合や
別のエラーが原因で、さらに引き起こされているエラー。
実行時エラーのエラーメッセージとは全く別のところが
原因になることもあるので注意。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
 |
|
複合的な問題の例 |
2箇所以上のコードのエラーの複合エラー |
コードのエラーとライブラリのバージョンの違いによるエラー |
OSと開発環境のバージョンの違いによるエラー |
|
|
|
|
 |
|
 |
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
エラーの原因の切り分け
どこにエラーの原因があるのか一つ一つ
切り分けて調べていく必要がある。
今後「原因の切り分け方」を覚えていく必要がある。
経験の差が出る部分なので焦らないこと。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
|
 |
|
 |
|
デバッグの基本のまとめ |
|
|
|
エラーの原因 |
・コードの問題 |
・コード以外の問題 |
・複合的な問題 |
|
|
IDEの機能を使う |
・エラー表示 |
・ブレークポイント |
・変数のウォッチ |
・ステップ実行 |
|
|
|
|
 |
|
 |
|
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
デバッグ方法のポイント
今まで正常に動いていたものが変更したらおかしくなった場合、
変更箇所に原因の元がある。
改変前と後の違いをよく考えてみること。
変更箇所に「関係する処理」に注目して「問題の整理」をする。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|
 |
|
 |
|
デバッグのポイント
・ |
改変前のコードと後のコードの違いを考える |
・ |
変更箇所に関係する処理に注目する |
・ |
問題を整理する |
|
|
|
 |
|
 |
|
|
|
|
|
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
バグは、時には解明するまで何日もかかる事もあります。
どこに原因があるのか的確な「切り分け」が必要になってきます。
徐々に詳しくなっていきましょう。 |
|
|
|
|
|
 |
 |
|
 |
 |
|
|
 |
 |
|
 |
 |
|
|
|
|
|
|
|
|
|
|