VB のたまご

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


ObjectDisposedException について

概要

  •  ObjectDisposedException は、破棄された参照型変数を操作しようとした時に発生する例外エラーです。 前の処理で、Close メソッドや Dispose メソッドを呼び出したままで、インスタンス生成しないで操作していないか、という視点で探すことが解決の糸口につながります。


スポンサーリンク


事例と対処方法

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

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

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

  • スポンサーリンク



  • Form.Dispose
  • Dim frm As New Form
    frm.Dispose()
    frm.Show()
    
    ' 例外エラー
    System.ObjectDisposedException: 破棄されたオブジェクトにアクセスできません。
    オブジェクト名 'Form' です。
       場所 System.Windows.Forms.Control.CreateHandle()
       場所 System.Windows.Forms.Form.CreateHandle()
       場所 System.Windows.Forms.Control.get_Handle()
       場所 System.Windows.Forms.Control.SetVisibleCore(Boolean value)
       場所 System.Windows.Forms.Form.SetVisibleCore(Boolean value)
       場所 System.Windows.Forms.Control.Show()
    
    ' 対処方法
    破棄チェックの実施
    Dim frm As New Form
    frm.Dispose()
    If frm IsNot Nothing AndAlso Not frm.IsDisposed Then
        frm.Show()
    End If
    
  •  だいたい、ObjectDisposedException か、NullReferenceException のどちらかが発生することが多いです。 Close メソッド、または Dispose メソッドを呼び出した直後なら、ObjectDispoedException が発生して、 参照型で未初期のまま、または Nothing をセットした直後なら、NullReferenceException が発生します。 対処方法には、破棄チェックと Nothing チェックを記載しています。


  • Form.Close
  • Dim frm As New Form
    frm.Close()
    frm.Show()
    
    ' 例外エラー
    System.ObjectDisposedException: 破棄されたオブジェクトにアクセスできません。
    オブジェクト名 'Form' です。
       場所 System.Windows.Forms.Control.CreateHandle()
       場所 System.Windows.Forms.Form.CreateHandle()
       場所 System.Windows.Forms.Control.get_Handle()
       場所 System.Windows.Forms.Control.SetVisibleCore(Boolean value)
       場所 System.Windows.Forms.Form.SetVisibleCore(Boolean value)
       場所 System.Windows.Forms.Control.Show()
    
    ' 対処方法
    破棄チェックの実施
    Dim frm As New Form
    frm.Close()
    If frm IsNot Nothing AndAlso Not frm.IsDisposed Then
        frm.Show()
    End If
    
  •  Close メソッドの場合も同様です。

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

  • スポンサーリンク