NullReferenceException和/或赋值之前的变量用法

时间:2014-05-30 13:58:55

标签: vb.net

我是.net的新手,我正在尽力去理解Nuances(或Nuisance)。我正在尝试在表单上打印文本。我确实找到了很多关于Graphics类,DrawString()等的例子。不幸的是,我无法让它们中的任何一个工作。对我来说,绊脚石似乎是错误“NullReferenceException”和/或警告“在分配之前的变量用法”。在" http://msdn.microsoft.com/en-US/library/76c5db29(v=vs.80).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1"中找到了一个例子。 vs2005显示警告"变量' myE'在被赋值之前使用。 null referene excpetion可能会在运行时产生,当我运行NullReferenceException时,会引发" e.Graphics.DrawString(drawString,drawFont,drawBrush,drawPoint)"我该如何解决这个问题?

Public Class Form1
    Public Sub DrawStringPointF(ByVal e As PaintEventArgs)
        Dim drawString As [String] = "Sample Text"
        Dim drawFont As New Font("Arial", 16)
        Dim drawBrush As New SolidBrush(Color.Black)
        Dim drawPoint As New PointF(150.0F, 150.0F)
        e.Graphics.DrawString(drawString, drawFont,drawBrush, drawPoint)
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim myE As PaintEventArgs
        DrawStringPointF(myE)
    End Sub
End Class

2 个答案:

答案 0 :(得分:3)

你不能这样做。

相反,处理Paint事件并绘制您需要的所有内容。

要触发重绘,请致电Invalidate()

答案 1 :(得分:0)

您的问题比您的问题更广泛。 您正在询问空引用异常是什么;其他地方已多次回答这个问题。 NRE(NullReferenceException)指的是一个未定义的变量

我们可以将记忆视为一个巨大的,开放的停车场。使用这样的语句定义变量时,

Dim myObject as Integer

...您要求停车场内有一个或多个停车位。但是,你所做的只是声明这个地点是你的,但不是它的内容。要给它一个值,只需使用equals运算符。

myObject = 100

简单对象(称为基元)(如字符串,数字和字符)在未定义时具有隐含值。例如,如果整数没有值,则假定它们为零。

在你的程序中,当你得到一个NRE时,将鼠标悬停在函数中的每个参数上以及调用该函数的对象。如果其中任何一个声称值为{{ 1}},那就是你的问题。您已为对象保留了空间,但尚未为其指定值。

正如SLaks所说,您的具体问题与您调用该方法的方式有关,但如果不清楚Nothing的含义,则可能无法正确解决基本问题>

最后,让我们看看特别是您的代码。你打电话 Nothing

在本声明中,您在内存中预留了空间 - 也就是说,声称我们之前谈过的停车位。但是,它没有价值!它是空的。程序无法正常运行,因为您要告诉它对不存在的事物执行操作。要解决此问题,请使用Dim myE as PaintEventArgs运算符。在创建新对象时,首先将它们保留在内存中(New实际上代表"在内存中定义")然后使用Dim运算符为它们赋值。你会看到类似的东西:

New

Dim myObj As Object

你也可以内联: myObj = New Object()

当您尝试使用PaintEventArgs执行此操作时,您会发现这很不可能。 PaintEventArgs需要从Windows窗体控件中获取的信息。您编写的方法需要处理事件。这篇文章太长了是的,所以希望其他人可以解释事件以及他们如何与方法相关。基本上,每个控件(文本框,图像,甚至图片本身)每次引发事件都会引发一个事件#34;到屏幕。你可以"处理"那件事;或者在发生时采取行动:

Dim myObj As Object = New Object()

您声明每当myControl为OnPaint引发事件时,它将使用控件提供的参数调用此方法。 您不能简单地从其他地方替换所需的参数。为了使其正常工作,必须从您想要绘制的控件传递事件参数。

我希望这会有所帮助。如果我不清楚,请告诉我。