VB のたまご

作成日: 2015/12/03, 更新日: 2015/12/03


NullReferenceException について

概要

  •  NullReferenceException は、該当変数が Nothing の場合に、発生する例外エラーです。 変数に何もセットしないまま操作した、前処理で使用したため、変数を初期化( Nothing をセット)したまま操作した等が考えられます。 変数に値がセットされているかどうか、という視点から見ると解決の糸口につながります。


スポンサーリンク


事例と対処方法

  •  以下のサンプルは、意図的に例外エラーを発生させるコードです。 実際の業務プログラムでは、このような簡単なコードではないと思いますが、例外発生させている、直接的な原因となる部分として参考になるはずです。 また、本例外エラーが発生してしまう原因となった、根本的な原因となる別の例外エラーが、さらに奥深くにいる場合があります。 (本例外エラーは間接的に影響を受けて発生してしまったもので、本当の原因となる例外エラーを食い止めることで、本例外エラーも直る場合があります。)

  •  このような組み合わせのパターンは、本例外エラーに限らず、他の例外エラー全般にも言えることですが、そんなに頻繁に出くわすものではないと思いますので、 そういう場合もあるということだけ、覚えておいていただけると解決しやすくなるのではと思います。

  •  また、記載の対処方法は、あくまでも一例です。 他の対処方法の方が、その業務プログラムにとってベストプラクティスとなる場合もありますので、検討材料の1つという程度に確認していただければと思います。

  • スポンサーリンク



  • 参照型、その1
  • Dim frm As Form1 = Nothing
    Dim formName As String = frm.Name
    
    ' 例外エラー
    System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
    
    ' 対処方法
    Dim frm As Form1 = Nothing
    Dim formName As String = String.Empty
    If frm IsNot Nothing AndAlso Not frm.IsDisposed Then
        formName = frm.Name
    End If
    
  •  参照型の変数を扱う際は、インスタンスの有無を事前チェックしてから操作するようにします。 フォームの場合、さらに破棄されていないかのチェックも行っています。 これは、フォーム使用後に Close や Dispose メソッドを呼び出して破棄した後で、再度フォームを表示しようとすると、ObjectDisposedException という別の例外エラーが発生するためです。


  • 参照型、その2
  • Dim lst As ArrayList = Nothing
    Dim i = lst(0)
    
    ' 例外エラー
    System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
    
    ' 対処方法
    Dim lst As ArrayList = Nothing
    If lst IsNot Nothing AndAlso 0 < lst.Count Then
        Dim i = lst(0)
    End If
    
  •  リスト系も参照型なので Nothing チェックを実施します。また、登録数が1つ以上の場合のみ、値の取得を行います。

  •  最後までこの記事を読んでいただき、ありがとうございました。

  • スポンサーリンク