错误对象引用未设置为对象的实例
问题描述:
我试图根据他们的经验水平(1-4)作为整数获得销售人员奖金的计算,以及他们已售出(1-10000)为小数。我为什么现在得到这个错误?这里是代码...错误对象引用未设置为对象的实例
Public Class Form1
Dim intLvlsTextBox1Numbers As String = Nothing And intLvlsTextBox1Numbers = txtBoxLvl.Text
Dim decSaleWkTextBox1Numbers As String = Nothing And decSaleWkTextBox1Numbers = txtBoxWklySale.Text
Private Sub btnCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalculate.Click
'The Try/Catch method is used to catch the "InvalidCastExceptionUnhandeled" in order to use the
'exception for detecting letters within the textboxes being understood in logic as of
'a wrong type, thus enabling its detection as letter or caracter.
Try
intLvlsTextBox1Numbers = Convert.ToInt32(txtBoxLvl.Text)
decSaleWkTextBox1Numbers = Convert.ToInt32(txtBoxWklySale.Text)
'This line is used to validate indetify non-valid data input upon entring numbers
'that are out of rang, and will display the warning error message. It goes from
'anything not convertable to Integer 32, i.e. letter, signs.
MessageBox.Show("Please, input a numerical value")
'Reset the cursor position when a non-valid data is inputed.
txtBoxLvl.Select()
'Catches the EX variable execption,"InvalidCastExceptionUnhandeled".
Catch ex As FormatException
End Try
'procedure call to the ChoiceMenus
ChoiceMenus()
End Sub
Private Sub ChoiceMenus()
Select Case intLvlsTextBox1Numbers
Case 1 To 4
End Select
Select Case decSaleWkTextBox1Numbers
Case 1 To 100000
End Select
End Sub
Private Sub isValidCalculation()
lblTotWkSale.Text = 250 * (intLvlsTextBox1Numbers + 1) + ((intLvlsTextBox1Numbers + 1)/100) * (decSaleWkTextBox1Numbers)
decSaleWkTextBox1Numbers = Convert.ToString(lblTotWkSale.Text)
lblTotWkSale.Text = decSaleWkTextBox1Numbers.ToString("c")
End Sub
Private Sub btnClr_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClr.Click
clearForm() 'procedure call
End Sub
Private Sub clearForm()
txtBoxWklySale.Text = ""
txtBoxLvl.Text = ""
lblTotWkSale.Text = ""
lblErrorMsg.Text = ""
txtBoxLvl.Select()
'tbxHome = True
'tbx1 = True
'tbx2 = True
End Sub
Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
Me.Close() 'closes the application
End Sub
End Class
谢谢!
答
问题是使用Convert.ToInt32
。该功能需要一个实现IConvertible
接口的对象。否则它会抛出一个InvalidCastException
。
你想要做的就是将String
解析为Int32
。与Int32.Parse
或Int32.TryParse
一起使用效果最佳。如果您不确定输入是否真的是十进制值,后者会很好。
那么到底这是要你想做的事:
intLvlsTextBox1Numbers = Int32.Parse(txtBoxLvl.Text)
decSaleWkTextBox1Numbers = Int32.Parse(txtBoxWklySale.Text)
答
Dim intLvlsTextBox1Numbers As String = Nothing And intLvlsTextBox1Numbers = txtBoxLvl.Text
你初始化领域的方式是非常有创意。虽然我不明白它应该做什么。运行时也不会,当窗体的构造函数运行时,它会用NRE炸弹你的程序。很难诊断,因为调试器没有很好的线向您展示。它失败了,因为txtBoxLvl变量尚未初始化,直到后来在InitializeComponent()运行后才会发生。不幸的是,也有一些vb.net隐藏的东西。
试着写更多理智的代码,你可以在一本关于vb.net编程的好书中找到这种代码。这些变量不应该是表单类中的字段,它们应该是方法中的局部变量:
Private Sub btnCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCalculate.Click
Dim intLvlsTextBox1Numbers As Integer '' It is not a string!!
Dim levelOk = Integer.TryParse(txtBoxLvl.Text, intLvlsTextBox1Numbers)
If Not levelOk Then
'' complain...
Return
End If
'' etc...
End Sub
不是这样。错误消息不是InvalidCastException – 2012-04-05 13:04:32