Vb.net 在带有文本框的类中未处理null引用异常
因此,我正在为我的班级做一个项目,我们必须写一个班级来制作一个收银机。它是一个简单的寄存器,有两个按钮:加法和减法。在第一个文本框中键入所需金额,结果显示在第二个文本框中。我从来没有在课堂上工作过,也不懂大部分的行话,所以简单的回答会很好!这是我目前掌握的代码:Vb.net 在带有文本框的类中未处理null引用异常,vb.net,Vb.net,因此,我正在为我的班级做一个项目,我们必须写一个班级来制作一个收银机。它是一个简单的寄存器,有两个按钮:加法和减法。在第一个文本框中键入所需金额,结果显示在第二个文本框中。我从来没有在课堂上工作过,也不懂大部分的行话,所以简单的回答会很好!这是我目前掌握的代码: Public Class frmRegister Dim reg As CashRegister Structure Equations Dim Amount As Double Dim
Public Class frmRegister
Dim reg As CashRegister
Structure Equations
Dim Amount As Double
Dim Balance As Double
End Structure
Class CashRegister
Private xAmount As Double
Private xBalance As Double
Public Property Amount As Double
Get
Return xAmount
End Get
Set(ByVal value As Double)
xAmount = value
End Set
End Property
Public Property Balance As Double
Get
Return xBalance
End Get
Set(ByVal value As Double)
xBalance = value
End Set
End Property
Function calc_sum() As Double
Dim AddMethod As Double
AddMethod = xBalance + xAmount
Return AddMethod
End Function
Function calc_sub() As Double
Dim SubtractMethod As Double
SubtractMethod = xBalance - xAmount
Return SubtractMethod
End Function
End Class
Private Sub frmRegister_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If txtBalance.Text = "" Then
txtBalance.Text = "0"
End If
End Sub
Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
reg.Amount = txtAmount.Text
reg.Balance = txtBalance.Text
txtBalance.Text = FormatCurrency(reg.calc_sum)
End Sub
Private Sub btnSubtract_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSubtract.Click
reg.Amount = txtAmount.Text
reg.Balance = txtBalance.Text
txtBalance.Text = FormatCurrency(reg.calc_sub)
If txtBalance.Text < 0 Then
MessageBox.Show("Transaction Cannot Result in Negative Balance!")
txtBalance.Text = "0"
End If
End Sub
End Class
公共类frmRegister
现金出纳机
结构方程
金额加倍
双倍暗平衡
端部结构
分级收银机
专用xAmount作为双
私人xBalance作为双
公共财产数额加倍
收到
返回装载
结束
设置(ByVal值为双精度)
xAmount=值
端集
端属性
公共财产余额加倍
收到
返回xBalance
结束
设置(ByVal值为双精度)
xBalance=值
端集
端属性
函数calc_sum()为双精度
Dim add方法为Double
AddMethod=xBalance+xAmount
返回添加方法
端函数
函数calc_sub()为双精度
双精度差分法
减法=xBalance-xAmount
返回减法
端函数
末级
私有子frmRegister_Load(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理MyBase.Load
如果txtBalance.Text=”“,则
txtBalance.Text=“0”
如果结束
端接头
私有子btnAdd_Click(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理btnAdd。单击
注册金额=txtAmount.Text
reg.Balance=txtBalance.Text
txtBalance.Text=格式货币(注册计算金额)
端接头
私有子btnSubtract_Click(ByVal sender作为System.Object,ByVal e作为System.EventArgs)处理btnSubtract。Click
注册金额=txtAmount.Text
reg.Balance=txtBalance.Text
txtBalance.Text=FormatCurrency(reg.calc_sub)
如果txtBalance.Text<0,则
MessageBox.Show(“交易不能导致负余额!”)
txtBalance.Text=“0”
如果结束
端接头
末级
当我进入按钮并引用txtboxs时,问题就出现了。他们在txtmount.text下面加下划线,并表示未处理空引用异常。我做错了什么。它怎么是空的?我尝试在前面添加cdbl,但这并没有什么区别似乎您的CashRegister类与包含文本框的form类不同。如果是这样,那么您需要对表单的引用(类的另一个属性,可以在构造函数中设置)。然后根据需要使用(该引用的名称).txtBalance.Text或(该引用的名称).txtmount.Text。变量
reg
为Nothing
,因此不能对其调用方法。与结构不同,在结构中,只要创建该类型的变量,结构就存在,而在类中,则必须显式地不满足该类。纠正此问题的最佳方法是将reg=new cash register()
添加到frmRegister\u Load
这样做的原因是,当结构直接存储在变量中时,类是对实例的引用,如果变量不指向实例是有效的,但变量不包含某些内容则是无效的
对于结构,内存直接存储在堆栈中,如下所示
Equations
Amount
Balance
因此,变量必须存在,因为它的空间存在
对于类,变量只包含类在堆中的位置,因此您必须使用new创建一个实例,以便变量指向。这将在编译时标记,而不会生成NullReferenceException这正是我需要的!非常感谢。因此,在主类完成后,您必须在下一节中将其声明为新的,以使其正常工作?我认为您必须使用equations.Amount而不是reg.Amount,或者您可能对equations.Amount和reg.Amount感到困惑,或者您可以使用reg.xAmount而不是reg.Amount