Zum tausendstenmal, aber doch irgendwie anders "System.NullReferenceException"

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Darkscale.

    Zum tausendstenmal, aber doch irgendwie anders "System.NullReferenceException"

    Hallo Community,
    ich drehe gleich noch voll durch. Der Allseitsgeliebte "System.NullReferenceException" treibt mich in den Wahnsinn. Hier der Code:

    Der Code soll alle csv-Dateien im Ordner "SourcePath" in das Array CSVFiles schreiben.

    Visual Basic-Quellcode

    1. Dim i As Integer = 0
    2. CSVFile = Dir$(SourcePath & "\*.csv")
    3. Do While CSVFile <> ""
    4. CSVFiles(i) = CSVFile
    5. i = i + 1
    6. Loop


    Nun bekomme ich bei der Zeile 5 [i = i + 1] den "System.NullReferenceException" Fehler.
    Im Debuggung sieht aber alles gut aus:
    i erkennt er vollkommen richtig mit dem Wert 0
    Ich konnte kein Objekt oder Wert finden, der NULL bzw. Nothing ist.

    Kann mir bitte jemand mal das Brett vom Kopf holen?

    ---------- LÖSUNG ----------
    Das Integerproblem blieb ungeklärt. Der "System.NullReferenceException" fehler entstand in der Zeile davor. Das Array CSVFiles wurde nicht korrekt initialisiert und hatte den Wert "Nothing".
    Schlussendlich wurde die Aufgabe folgenden gelöst:

    Aufgabe: Speichere alle CSV-Dateinamen mit Pfad in einem Ordner in einem Array

    VB.NET-Quellcode

    1. Dim CSVFiles As New List(Of String)
    2. Dim CSVFiles() = IO.Directory.GetFiles(SourcePath, "*.csv")


    Danke an das Forum für die Unterstützung.
    Wer nichts weiß ist nicht Dumm sondern unwissend!
    VB.NET Neueinsteuger... aber natürlich immer in "Option Explicit" - sonst lernt man nit!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Darkscale“ ()

    Darkscale schrieb:

    Nun bekomme ich bei der Zeile 5 [i = i + 1] den "System.NullReferenceException" Fehler.
    Wahrscheinlich eine Zeile höher.
    Andert CSVFile überhaupt seinen Wert ?
    Wie ist CSVFiles deklariert?
    ====
    Allerdings empfehle ich Dir, mal auf VB.NET umzuschwenken.

    VB.NET-Quellcode

    1. Dim CSVFiles() = IO.Directory.GetFiles(SourcePath & "\*.csv")

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hallo,
    Hier die Deklarationen:

    Quellcode

    1. ​Public CSVFiles As List(Of String)
    2. Public CSVFile As String


    Die Variable CSVFile enthält den gesuchten Dateinamen "Test.CSV"
    Die Variable CSVFiles bekommt korrekterweise die 0 zugeordnet CSVFiles(0) = Nothing

    Stimmt der Wert wurde nicht gespeichert!
    Wer nichts weiß ist nicht Dumm sondern unwissend!
    VB.NET Neueinsteuger... aber natürlich immer in "Option Explicit" - sonst lernt man nit!
    Richtig wäre Public CSVFiles As New List(Of String); sonst ist es nur eine Deklaration. Aber zu einer nur deklarierten Klasseninstanzvariable kann man keine Zuweisung machen. Ok, geht schon. Aber dann kommt die genannte Fehlermeldung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ok habe nun mal ein bisschen Probiert:

    VB.NET-Quellcode

    1. Dim CSVFiles() = IO.Directory.GetFiles(SourcePath & "\*.csv")​

    Fehler: System.ArgumentException: "Illegales Zeichen im Pfad." In der Variable finde ich jetzt aber Pfadseitig nichts besonderes. Es sei denn die Kiste fällt mal wieder über die Anführungszeichen, da ich Leerzeichen im Pfad habe.

    VB.NET-Quellcode

    1. ​Public CSVFiles As New List(Of String)

    Das habe ich übernommen. Da hast du Recht. Leider hilft auch das nicht weiter...
    Fehler: System.ArgumentOutOfRangeException
    Hier löst der auch die 0 in CSVFiles(i) nicht mehr auf.
    Wer nichts weiß ist nicht Dumm sondern unwissend!
    VB.NET Neueinsteuger... aber natürlich immer in "Option Explicit" - sonst lernt man nit!

    Darkscale schrieb:

    "Illegales Zeichen im Pfad."
    Sorry.

    VB.NET-Quellcode

    1. Dim CSVFiles() = IO.Directory.GetFiles(SourcePath, "*.csv")
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Danke für den Tipp so funktioniert das ja quasi in einer einzigen Codezeile. Dennoch würde ich sagen, dass es eher eine Das-Problem-Umgangen-Methode darstellt. Da ich gerne etwas lernen würde:

    Warum läuft der Debugger über die Problemzeile hinweg und prangert erst die Zeile danach an? Macht der das öfter?
    Wer nichts weiß ist nicht Dumm sondern unwissend!
    VB.NET Neueinsteuger... aber natürlich immer in "Option Explicit" - sonst lernt man nit!
    @Darkscale Das könnte was damit zu tun haben, wo im Framework der eigentliche Fehler auftritt, bin mir aber nicht ganz sicher.
    Du wirst mit der Zeit ein Gefühl dafür entwickeln, welche Exceptions in welchen Code-Zeilen auftreten können oder eben nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Es gibt eine Stelle an der ein Fehler Auftritt und eine an der dieser dann aufschlägt. Muss nicht immer die gleiche Stelle sein...

    Z.B. Ich habe vergessen ein Objekt zu instanzieren. 50 Zeilen weiter unten greife ich auf das Objekt zu und alles fliegt mir um die Ohren. :)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    mrMo schrieb:

    und alles fliegt mir um die Ohren
    aber eben in der Zeile, wo Du auf das Objekt zugreifst.
    Hier kommt der Fehler ja offenbar bei einer elementaren Integer-Operation, was ich mir allerdings nicht vorstellen kann.
    @Darkscale Kannst Du mal nen Screenshot machen mit der genannten Exception?
    Erweiterte Antwort => Dateianhänge => Hochladen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hallo nochmal,

    Jetzt ist mal wieder genau das eingetreten, was man beim Debuggen so gar nicht gebrauchen kann -> Failure Loss X/

    Aber ihr könnt euch sicher sein, dass ich mich nochmal melde, falls mir das Phänomen wieder begegnet.

    @mrMo: Ich weiß was du meinst. Nun war es bei mir eben in einer eigentlich völlig banalen Integer Addition.

    Trotzdem mal wieder großen Dank an euch...
    Wer nichts weiß ist nicht Dumm sondern unwissend!
    VB.NET Neueinsteuger... aber natürlich immer in "Option Explicit" - sonst lernt man nit!