Nullについてのエラー

タグの編集
投稿者 VB初心者  (学生) 投稿日時 2012/6/14 16:30:42
学校でVBのプログラムの勉強をしています.
作成しているプログラムなんですが,


Dim g As Drawing.Graphics
        g.DrawLine(drawpen, ixx1, iyy1, ixx2, iyy2) ←ここに変数 'g' は、値が割り当てられる前に使用されています。Null 参照の例外が実行時に発生する可能性があります。


とエラーが出ます.
どなたか教えていただけないでしょうか?
null refarence exceptionはハンドルされませんでした.とでています.
投稿者 shu  (社会人) 投稿日時 2012/6/14 17:16:41
Dim g~
g.Drawing~
の間にgに何かインスタンスを代入しましょう。

投稿者 るきお  (社会人) 投稿日時 2012/6/14 20:23:38
クラスのメソッドやプロパティの大多数はインスタンスに対して使用する必要があります。
インスタンスがない状態でメソッドやプロパティを使用するとNullReferenceExceptionが発生します。
たとえば、次の例ではStringクラスのインスタンスがない状態でLengthプロパティを使おうとしているのでNullReferenceExceptionが発生します。
Dim St As String
MsgBox(St.Length)


GraphicsクラスのDrawLineメソッドもそうです。
インスタンスをどのように取得するかの方法はさまざまです。よく見かけるのはNewを使用する方法ですが、今回はNewの出番はありません。

このあたりの事情は以下の記事で解説しているので参考にしてください。
初級講座第5回 メソッドと関数
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard5.htm

初級講座第9回 クラスの使い方
http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard9.htm


今回の例を簡単に解決する例を紹介します。
この例はPictureBox1に対して描画を行う場合です。
Dim drawpen As Pen = Pens.Red
Dim ixx1 As Single = 10
Dim iyy1 As Single = 10
Dim ixx2 As Single = 100
Dim iyy2 As Single = 120

Dim g As Drawing.Graphics
g = PictureBox1.CreateGraphics
g.DrawLine(drawpen, ixx1, iyy1, ixx2, iyy2)


これでインスタンスの問題は解決しますが、グラフィックのセオリーからははずれています。
セオリーではPaintイベントで描画を実行することになっておりその場合は次のようにします。
Private Sub PictureBox1_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
    Dim drawpen As Pen = Pens.Red
    Dim ixx1 As Single = 10
    Dim iyy1 As Single = 10
    Dim ixx2 As Single = 100
    Dim iyy2 As Single = 120
    e.Graphics.DrawLine(drawpen, ixx1, iyy1, ixx2, iyy2)
End Sub