0

クラスレベルで変数を宣言し、その変数をプロシージャで使用すると、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というエラーが発生することがあります。

たとえば、これは特定の温度での物質の状態を表示するプログラムを作成する私の最新のプロジェクトです。

 Public Class Form1
   Const WATER_FP As Integer = 0
   Const WATER_BP As Integer = 100

   Const ETHANOL_FP As Integer = -114
   Const ETHANOL_BP As Integer = 78

   Const MERCURY_FP As Integer = -39
   Const MERCURY_BP As Integer = 357

   Const OXYGEN_FP As Integer = -219
    Const OXYGEN_BP As Integer = -183

    Dim strSolid As String = vbNullString
    Dim strGas As String = vbNullString
    Dim sngTemperature As Single = CSng(txtTemperature.Text)

   Private Sub btnDisplayState_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisplayState.Click


      If sngTemperature <= WATER_FP Then
         strSolid &= "Water "
      ElseIf sngTemperature >= WATER_BP Then
         strGas &= "Water "
      End If

      If sngTemperature <= ETHANOL_FP Then
         strSolid &= "Ethanol "
      ElseIf sngTemperature >= ETHANOL_BP Then
         strGas &= "Ethanol "
      End If

      If sngTemperature <= MERCURY_FP Then
         strSolid &= "Mercury "
      ElseIf sngTemperature >= MERCURY_BP Then
         strGas &= "Mercury "
      End If

      If sngTemperature <= OXYGEN_FP Then
         strSolid &= "Oxygen "
      ElseIf sngTemperature >= OXYGEN_BP Then
         strGas &= "Oxygen "
      End If

      If strSolid <> vbNullString Then
         strSolid = "Substances that are in solid state are " & strSolid
      Else
         strSolid = "No substances are in solid state."
      End If

      If strGas <> vbNullString Then
         strGas = "Substances that are in gaseous state are " & strGas
      Else
         strGas = "No substances are in gaseous state."
      End If

      lblMessage.Text = strSolid & ControlChars.CrLf & strGas
   End Sub
End Class

デバッグ時に、コードが問題を引き起こしている場所が強調表示されずに、上記のようなエラーが発生します。ただし、変数を に移動するbtnDisplayState_Clickと、プログラムは完全に機能します。エラーの原因はわかりましたが、さらに、この問題が発生する理由を知りたいと思っていました。

4

2 に答える 2

2

コントロールはまだ初期化されていないため、コントロールのプロパティで変数を宣言することはできません。値が存在する前ではなく、何らかのテキストが入力された後に値を設定する必要があります。

 Dim sngTemperature As Single = CSng(txtTemperature.Text)'no value here yet

クラスレベルで宣言するだけです:

 Dim sngTemperature As Single 

次に、ボタンイベントに設定します。

于 2013-10-17T02:52:57.010 に答える
0
Dim sngTemperature As Single = CSng(txtTemperature.Text)

そのような変数を割り当てないでください。txtTemperature.Text は sngTempearature の前に初期化されると想定しています。簡単な修正、次のように変更:

Dim sngTemperature As Single = 0

まず、メソッドを変更します。

Private Sub btnDisplayState_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisplayState.Click

  sngTemperature = CSng(txtTemperature.Text)

  If sngTemperature <= WATER_FP Then
     strSolid &= "Water "
  ' etc etc
于 2013-10-17T02:59:58.153 に答える