2009-12-07 61 views
2

我在VB.Net中收到以下错误。Visual Basic - 未将对象引用设置为对象的实例

“对象引用不设置为一个对象的一个​​实例”

它突出“下一步”的For循环的结束。

任何帮助将是伟大的。

Imports System.IO 
Public Class LoginForm 
    Dim Username() As String 
    Dim Password() As String 
    Dim Index As Integer 

    Public Function encrypt(ByVal data As String) As String 
     Dim answer As String = "" 
     Dim I As Integer 
     data = RTrim(data) 
     If Mid(data, 1, 1) <> Chr(0) Then 
      For I = 1 To Len(data) 
       answer = answer + Chr(Asc(Mid(data, I, 1)) Xor 23) 
       ' Xor 23 is a simple encription cipher, a string can be 
       ' encrypted or de-encrypted by the value following the Xor 
       'i.e. "23" ' 
      Next I 
     End If 
     encrypt = answer 
    End Function 

    Private Sub LoginButton_Click(ByVal sender As System.Object, _ 
            ByVal e As System.EventArgs) _ 
           Handles LoginButton.Click 

     For Each I In Username 

      If UserNameTextBox.Text = Username(Index) Then 
       UserAdd.Show() 
       Me.Hide() 
       If PasswordTextBox.Text = Password(Index) Then 
        MessageBox.Show("Correct Password") 
       Else 
        MessageBox.Show("Invalid Password, Sorry") 
       End If 
      Else : MessageBox.Show("Invalid Username, Sorry") 
      End If  
     Next  
    End Sub 

    Public Sub ReadUsers() 
     Dim CurrentFileReader As StreamReader 
     Dim FileName, Line As String 
     Dim Delimiter As Char = "," 
     Dim Feild() As String 
     Dim Username() As String 
     Dim Password() As String 
     Dim Index As Integer 

     FileName = "C:\Computing\Projects\Login\Users.txt" 'location of 
                  'user file 
     CurrentFileReader = New StreamReader(FileName) 

     Do Until CurrentFileReader.EndOfStream 

      Line = CurrentFileReader.ReadLine 
      If Line = Nothing Then 
       Exit Do 
      End If 

      ReDim Preserve Username(Index) 
      ReDim Preserve Password(Index) 

      Feild = Line.Split(Delimiter) 

      Username(Index) = encrypt(Feild(0)) 
      Password(Index) = encrypt(Feild(1))   
     Loop 
    End Sub   

    Private Sub LoginForm_Load(ByVal sender As Object, _ 
           ByVal e As System.EventArgs) _ 
          Handles Me.Load 
     Call ReadUsers() 
    End Sub 
End Class 
+1

有一个以上的在循环您码。哪一个抛出异常?它是在第一遍还是以后发生?您是否应该检查集合中是否有零个以上的项目? – DOK 2009-12-07 13:52:58

+1

以“Next”结尾的第一个循环 – 2009-12-07 14:18:57

回答

0

下一个是你指的是哪一个?

在你的第二个问题中,将其定义为I.这可能无法解决问题,但这确实是一个更好的实践。

你的数据是否有可能产生'null'字符(chr(0))?

如果mid到达字符串的末尾,Mid将返回null,但它看起来不会发生在您身上。

不过,你可能想使用String.Substring而不是mid。这是一个在字符串对象中找到的函数。

+0

String.Substring也不起作用。 – 2009-12-07 15:34:35

+0

你的数据字符串的内容是什么? – 2009-12-07 16:22:01

1

尝试更换验证码:这个代码

For Each I In Username 

      If UserNameTextBox.Text = Username(Index) Then 
       UserAdd.Show() 
       Me.Hide() 
       If PasswordTextBox.Text = Password(Index) Then 
        MessageBox.Show("Correct Password") 
       Else 
        MessageBox.Show("Invalid Password, Sorry") 
       End If 
      Else : MessageBox.Show("Invalid Username, Sorry") 
      End If 

Next 

For Each I In Username 

     if Username(i) is not null then 

      If UserNameTextBox.Text = Username(Index) Then 
       UserAdd.Show() 
       Me.Hide() 
       If PasswordTextBox.Text = Password(Index) Then 
        MessageBox.Show("Correct Password") 
       Else 
        MessageBox.Show("Invalid Password, Sorry") 
       End If 
      Else : MessageBox.Show("Invalid Username, Sorry") 
      End If 
     else 
      ....handle empty string 
     end if 

     Next 
0

我要猜测,它是“对于每一个我在用户名”内LoginButton_Click循环是造成你的问题?

我在这个循环中猜测变量“I”的类型没有被声明,因此默认情况下它会是类型Object,匹配错误“Object reference not set to a instance of a object” 。

0
  1. Sub ReadUsers(),使用本地定义的变量作为用户名,索引和密码。从Sub ReadUsers()中删除这些行。

    Dim Username() As String 
    Dim Password() As String 
    Dim Index As Integer 
    
  2. 在你的课堂上。

    A.添加此导入到文件的顶部:

    Imports System.Collections.Generic 
    

    B.改变你的字符串数组定义,以列表(一个String)

    Dim Username As List(Of String) 
    

    。然后您不再需要去Redim。刚:

    Username.add(encrypt(Feild(0))) 
    
  3. 循环的次数,而不是项目:

    For i as integer = 0 to Username.length - 1 
    
    
          If UserNameTextBox.Text = Username(i) Then 
          ... 
    
         Next 
    

最后,这里是你的代码:

Imports System.IO 
Imports System.Collections.Generic 
Public Class LoginForm 

    ' At the Class level Dim is equivalent to Private 
    Private Username As List(Of String) 
    Private Password As List(Of String) 
    Private Index As Integer 

    Public Function encrypt(ByVal data As String) As String 
     Dim answer As String = "" 
     Dim I As Integer 
     data = RTrim(data) 
     If Mid(data, 1, 1) <> Chr(0) Then 
      For I = 1 To Len(data) 
       answer = answer + Chr(Asc(Mid(data, I, 1)) Xor 23) 
       ' Xor 23 is a simple encription cipher, a string can be 
       ' encrypted or de-encrypted by the value following the Xor 
       'i.e. "23" ' 
      Next I 
     End If 
     encrypt = answer 
    End Function 

    Private Sub LoginButton_Click(ByVal sender As System.Object, _ 
            ByVal e As System.EventArgs) _ 
            Handles LoginButton.Click 

     For i As Integer = 0 To Username.length - 1 

      If UserNameTextBox.Text = Username(i) Then 
       UserAdd.Show() 
       Me.Hide() 
       If PasswordTextBox.Text = Password(i) Then 
        MessageBox.Show("Correct Password") 
       Else 
        MessageBox.Show("Invalid Password, Sorry") 
       End If 
      Else : MessageBox.Show("Invalid Username, Sorry") 
      End If 
     Next 
    End Sub 

    Public Sub ReadUsers() 
     Dim CurrentFileReader As StreamReader 
     Dim FileName, Line As String 
     Dim Delimiter As Char = "," 
     Dim Feild() As String 


     FileName = "C:\Computing\Projects\Login\Users.txt" 'location of 
     'user file 
     CurrentFileReader = New StreamReader(FileName) 

     Do Until CurrentFileReader.EndOfStream 

      Line = CurrentFileReader.ReadLine 
      If Line = Nothing Then 
       Exit Do 
      End If 

      Feild = Line.Split(Delimiter) 

      Username.Add(encrypt(Feild(0))) 
      Password.add(encrypt(Feild(1))) 
     Loop 
    End Sub 

    Private Sub LoginForm_Load(ByVal sender As Object, _ 
           ByVal e As System.EventArgs) _ 
          Handles Me.Load 
     Call ReadUsers() 
    End Sub 
    End Class 
相关问题