NullReferenceException

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von retecvb.

    NullReferenceException

    Hey,

    Ich bekomme diesen NullReferenceException Fehler, ich weiß zwar das er auftreten kann wenn ein Objekt nicht richtig behandelt wurde aber ich weiß leider nicht wo der Fehler sein könnte.
    Hier der problematische Code:

    VB.NET-Quellcode

    1. Private Sub downloader_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles downloader.DownloadFileCompleted
    2. 'Version neu eintragen.
    3. Me.ProgressBar1.Value = 0
    4. My.Computer.FileSystem.WriteAllText("" & CurPath & "\ressystem\version.txt", "" + Me.CurLoading.Text + "", False)
    5. Me.LocalVersionInt.Text = Me.CurLoading.Text
    6. Me.FileLbl.Text = "Extracting (" & Me.CurLoading.Text & ".rar)..."
    7. 'Datei entpacken
    8. Dim Process As Process = Process.Start("UnRAR.exe", "x -y -ac 00" + Me.CurLoading.Text + ".rar")
    9. Process.WaitForExit()
    10. File.Delete("00" + Me.CurLoading.Text + ".rar")
    11. 'Wieder überprüfen...
    12. Dim flag As Boolean
    13. flag = Operators.CompareString(Me.LocalVersionInt.Text, Me.CurVersionInt.Text, False) = 0
    14. If flag Then
    15. Me.LaunchBtn.Enabled = True
    16. Me.PercentLbl.Text = "Finish"
    17. Me.CurLoading.Visible = False
    18. Else
    19. Me.ProgressBar1.Value = 0
    20. Me.CurLoading.Text = Me.LocalVersionInt.Text + 1
    21. Me.downloader.DownloadFileAsync(New Uri("http://unitdeorum.bplaced.net/update_" + Me.CurLoading.Text + ".rar"), "00" + Me.CurLoading.Text + ".rar")
    22. End If
    23. Return
    24. End Sub
    25. Private Sub downloader_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles downloader.DownloadProgressChanged
    26. 'Prozess.
    27. Me.FileLbl.Text = "File: " & Me.CurLoading.Text & ".rar (" & e.BytesReceived.ToString & "/" & e.TotalBytesToReceive.ToString & ")"
    28. Me.ProgressBar1.Value = e.ProgressPercentage
    29. Me.PercentLbl.Text = e.ProgressPercentage & "%"
    30. End Sub


    Erkennt jemand einen Fehler? :(

    Niklas
    NullReferenceException:

    ************** Ausnahmetext **************
    System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    bei LaunchSL.SuaLegenda.SuaLegenda_Load(Object sender, EventArgs e)
    bei System.EventHandler.Invoke(Object sender, EventArgs e)
    bei System.Windows.Forms.Form.OnLoad(EventArgs e)
    bei System.Windows.Forms.Form.OnCreateControl()
    bei System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
    bei System.Windows.Forms.Control.CreateControl()
    bei System.Windows.Forms.Control.WmShowWindow(Message& m)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
    bei System.Windows.Forms.Form.WmShowWindow(Message& m)
    bei System.Windows.Forms.Form.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    Definition:

    VB.NET-Quellcode

    1. Public WithEvents downloader As New WebClient
    Load-Event:

    VB.NET-Quellcode

    1. 'version.txt erstellen wenn sie nicht existiert.
    2. If Not File.Exists("" & CurPath & "\ressystem\version.txt") Then
    3. File.WriteAllText("" & CurPath & "\ressystem\version.txt", "0")
    4. End If
    5. 'UnRAR.exe runterladen wenn sie nicht existiert.
    6. If Not File.Exists("UnRAR.exe") Then
    7. My.Computer.Network.DownloadFile("http://unitdeorum.bplaced.net/UnRAR.exe", "UnRAR.exe")
    8. End If
    9. 'Aktuelle Spielclient Version ermitteln.
    10. Dim CurrentVersion As String
    11. CurVer.Credentials = New Net.NetworkCredential("" & FTPUser & "", "" & FTPPass & "")
    12. CurrentVersion = CurVer.DownloadString("ftp://" & FTPServer & "/version.txt")
    13. 'Aktuelle News ermitteln und anzeigen lassen.
    14. Dim News As String
    15. SLNews.Credentials = New Net.NetworkCredential("" & FTPUser & "", "" & FTPPass & "")
    16. News = SLNews.DownloadString("ftp://" & FTPServer & "/news.txt")
    17. SLNewsLbl.Text = News
    18. 'Lokale Spielclient Version ermitteln und in eine Variable legen.
    19. Dim sR As New System.IO.StreamReader("" & CurPath & "\ressystem\version.txt")
    20. Dim LocalVersion As String
    21. LocalVersion = sR.ReadLine()
    22. sR.Close()
    23. CurVersionInt.Text = CurrentVersion
    24. LocalVersionInt.Text = LocalVersion
    25. 'Prüfen ob Aktualisierungen verfügbar sind, wenn ja Update starten.
    26. Dim check As Boolean
    27. check = Operators.CompareString(Me.LocalVersionInt.Text, Me.CurVersionInt.Text, False) = 0
    28. If check Then
    29. Me.LaunchBtn.Enabled = True
    30. Me.PercentLbl.Text = "Up to date"
    31. Me.CurLoading.Visible = False
    32. Else
    33. Me.ProgressBar1.Value = 0
    34. Me.CurLoading.Text = Me.LocalVersionInt.Text + 1
    35. Me.downloader.DownloadFileAsync(New Uri("http://unitdeorum.bplaced.net/update_" + Me.CurLoading.Text + ".rar"), "00" + Me.CurLoading.Text + ".rar")
    36. End If
    37. 'Versionen anzeigen lassen.
    38. CurVersionInt.Text = CurrentVersion


    Edit:
    Ich hab den Code mehrmals durchgeguckt aber nix gefunden... Debug sagt wie gesagt auch nix

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „retecvb“ ()

    retecvb schrieb:

    Debug sagt wie gesagt auch nix

    Was heisst das ? Genau wie haiyyu stell ich die Frage nach der Zeile in der dieser Fehler produziert wird.

    Hast Du den Code ab Load-Event im Einzelschritt-Modus durchgeführt ? Läuft oder nicht ?
    Breakpoint auf DownLoadFileCompleted Event, auch im Einzelschritt durchgehen.

    Lass mal etwas mehr hören.

    P.S: Option Strict On würde auch nicht schaden
    Fehler gefunden.. War ein Error im Load-Event. Das Programm konnte einen Wert nicht auslesen da ich den Pfad geändert habe.. x.x Schusselig...
    Nur dafür weiß ich leider trozt

    Mal eine Frage, was bewirkt "Option Strict On"?

    #EDIT:
    Nur leider weiß ich immer noch keine Lösung...
    Er soll einen Key aus der Registerdatenbank von Windows holen.
    Nur dieses existiert beim FirstRun des Programms noch nicht, kann ich checken ob der Key schon existiert oder nicht?
    Momentaner Code:

    VB.NET-Quellcode

    1. Dim CheckKey As RegistryKey
    2. Dim CheckID As String
    3. CheckKey = Registry.CurrentUser.OpenSubKey( _
    4. "Software\content Entertainment\Sua Legenda")
    5. CheckID = CheckKey.GetValue("sLoginName", "")
    6. CheckKey.Close()
    7. If CheckID = "" Then
    8. Dim RegKey As RegistryKey
    9. RegKey = Registry.CurrentUser.OpenSubKey( _
    10. "Software\content Entertainment\Sua Legenda")
    11. RegKey.SetValue("sLoginName", "-")
    12. RegKey.Close()
    13. Else
    14. Dim MeinKey As RegistryKey
    15. Dim MeinName As String
    16. MeinKey = Registry.CurrentUser.OpenSubKey( _
    17. "Software\content Entertainment\Sua Legenda")
    18. MeinName = MeinKey.GetValue("sLoginName", "")
    19. MeinKey.Close()
    20. LoginUsrTxtBox.Text = "" & MeinName & ""
    21. End If


    Nur dabei passiert eben dieser Fehler.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „retecvb“ ()

    Option Strict-Anweisung

    Primär bewirkt das, dass Der Compiler nicht immer rät was Du eventuell gerade von einem Format in das andere konvertieren möchtest ( zu 95% rät er gut, 5% gehen in die Hose und produzieren schwer zu findende Fehler).

    In Deinem Programm haut er Dir auf jeden Fall auf die Finger wenn Du mit Text rechnen willst:

    VB.NET-Quellcode

    1. Me.CurLoading.Text = Me.LocalVersionInt.Text + 1 ' bitte so nicht


    Ausserdem habe ich mich schon beim ersten Durchlesen Deines Codes gefragt wie robust Dein Code gegen Fehler ist. Zum Beispiel ist das Aufrufen des DownloadFileAsync aus dem Completed Event schon wacklig ohne besonderes Fehlerhandling.
    Habe meinen Post editiert.

    Und nunja fange gerade erst an mit .NET und bin deshalb nicht so weit wie du wahrscheinlich.
    Wie meinst du das mit "Robust gegen Fehler"?


    #EDIT:

    Gut Option Strict zeigt mir, wie du schon sagtest, diesen Rechenerror an.
    Wie löst man sowas am geschicktesten?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „retecvb“ ()

    RegistryKey Methoden
    OpenSubKey gibt Nothing zurück wenn er nichts findet.

    retecvb schrieb:

    Wie meinst du das mit "Robust gegen Fehler"?

    Mit robust meine ich konkret , dass das Programm nicht nur in 'Schönwetterlagen' funktionieren sollte: Dein ganzes Load Event ist abhängig vom Vorhandensein von Webstring/Files, RegistryKeys, der Unrar.exe etc.

    Was passiert wenn dort mal etwas nicht so zusammen passt , bekommst Du dann irgendwo Hinweise ? Oder spaziert Dein Downloader evtl in eine Endlosschleife oder macht sonstigen Unsinn ?

    Ich will an Deinem Code nicht herumkritteln, nur würde ich ein bisschen mehr Fehlerhandling einbauen, für 'Schlechtwetterlagen' ... ;)
    NEIN!
    Try Catch nur da einsetzen, wo es wirklich absolut total nötig ist... also nicht hier.

    Nemen wie mal Zeile 14 aus dem ersten Post:

    VB.NET-Quellcode

    1. CurrentVersion = CurVer.DownloadString("ftp://" & FTPServer & "/version.txt")

    Was passiert, wenn der Server probleme hat?
    Oder wenn der User keine Internetverbindung hat?

    Da müssen ein paar Abfragen her:

    VB.NET-Quellcode

    1. If ServerVerfügbar Then
    2. CurrentVersion = CurVer.DownloadString("ftp://" & FTPServer & "/version.txt")
    3. Else
    4. 'Dem User mitteilen, dass der Server nicht erreichbar ist.
    5. End If


    Edit:
    Das war so gemeint:
    Wenn jemand Dein Programm dekompiliert (auf "Bitte nicht dekompilieren" darf man sich nicht verlassen), dann sieht er die ganzen Daten.
    Diese sollten in einer externen Datei liegen, die extrem verschlüsselt ist, darum herum noch einige Sicherheitsmechanismen, etc.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Okay also zuerst den Server anpingen und dann die Daten laden.

    Und wie würdest du das mit der Externen Datei machen?

    #EDIT:
    Habe FTP mit HTTP ausgetauscht, ist es so besser?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „retecvb“ ()

    Äpfuh...
    Noch nie gebraucht, da keines meiner Programme bisher irgendwie mit nem Server kommuniziert hat.

    Aber es gibt sicherlich viele hier im Forum mit Erfahrung in dem Bereich.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Kangaroo schrieb:

    Option Strict-Anweisung

    Primär bewirkt das, dass Der Compiler nicht immer rät was Du eventuell gerade von einem Format in das andere konvertieren möchtest ( zu 95% rät er gut, 5% gehen in die Hose und produzieren schwer zu findende Fehler).

    In Deinem Programm haut er Dir auf jeden Fall auf die Finger wenn Du mit Text rechnen willst:

    VB.NET-Quellcode

    1. Me.CurLoading.Text = Me.LocalVersionInt.Text + 1 ' bitte so nicht



    Zudem nochmal, wie sollte ich denn rechnen?