別のバグ : 他のエラーを発見する
更新 : 2007 年 11 月
このレッスンでは、特定の状況でのみ発生する論理エラーを見つける方法について説明します。
前のレッスン「想定外の現象 : 論理エラーの検出」では、論理上発生したエラーを検出して修正する方法について説明しました。前のレッスンのコード例には、他にもバグが隠れています。これは、特定の状況でのみ発生するため、検出が困難なバグです。
プログラムのテスト
プログラマは、プログラムをテストして、プログラムが希望どおりに動作するかどうかを確認するのには適していません。プログラムがどのように動作するかを知っているため、論理エラーが検出されるような間違いをする可能性はほとんどありません。しかし、プログラムに慣れていないユーザーは、予想外の処理を実行する可能性があります。
たとえば、旅行したマイル数をかかった時間で割って、1 時間あたりのマイル数を計算するプログラムでは、ユーザーが時間数やマイル数にゼロを入力した場合、どうなるでしょうか。では、実際に試して確認してみましょう。
やってみよう
プログラムをテストするには
前のレッスン「想定外の現象 : 論理エラーの検出」で作成した LogicErrors プロジェクトを開きます。
メモ : 前のプロジェクトを完了または保存していない場合は、続行する前に、前のプロジェクトに戻って完了する必要があります。
F5 キーを押してプログラムを実行します。最初のテキスト ボックスに「0」(分を表す) と入力し、2 番目のテキスト ボックスに「5」(マイルを表す) と入力して、Button1 をクリックします。
"Average speed Infinity" というメッセージを含むメッセージ ボックスが表示されます。
プロジェクトは開いたままにしておいてください。次の手順で、論理エラーを検出する方法について説明します。
5 を 0 で割ると無限大か
前の手順で、"無限大" を予期していたわけではありませんが、これは数学的には正確です。5 を 0 で割ると商は無限大です。しかし、これはプログラムのユーザーに対して表示したい結果ではありません。これを回避するには、どのような方法があるでしょうか。
「問題が発生した場合の対処 : エラー処理」のレッスンで説明した手順に従って、エラー ハンドラを追加するという方法も考えられます。しかしこの場合にはうまくいきません。"無限大" という結果はエラーではなく、単に、表示したい結果と異なるというだけだからです。
速度をゼロと表示しても役に立たないため、問題を修正する 1 つの方法は、値がゼロでないかチェックして、ゼロより大きい値を入力する必要があることをユーザーに警告することです。ユーザーが負数を入力できないようにすることもできます。負数を使用した場合も、誤った結果が生成されるためです。
次の手順では、値がゼロより大きい場合のみ GetMPH 関数を呼び出すように、Button1_Click イベント ハンドラのコードを変更します。
やってみよう
バグを修正するには
コード エディタで、Button1_Click イベント ハンドラのコードを次のように変更します。
Dim minutes As Integer = CInt(Textbox1.Text) Dim miles As Double = CDbl(Textbox2.Text) Dim hours As Double = 0 If minutes <= 0 Or miles <= 0 Then MsgBox("Please enter a number greater than zero") Else hours = minutes / 60 MsgBox("Average speed " & GetMPH(miles, hours)) End If
F5 キーを押して再度プログラムを実行します。最初のテキスト ボックスに「0」、2 番目のテキスト ボックスに「5」と入力します。次に Button1 をクリックします。
0 より大きな値を入力するよう指示するメッセージ ボックスが表示されます。他のさまざまな数値の組み合わせでプログラムをテストし、バグが修正されたことを確認します。
次の手順
このレッスンでは、予期しない動作の原因になった論理エラーを検出して修正する方法について説明しました。次のレッスンでは、コード内でコメントを使用する方法について説明します。
次のレッスン : 「プログラムの注釈 : コメントを使用する」
参照
処理手順
エラーの検出 : Visual Basic のデバッグの概要