Indexfehler beim wiederholten Aufruf der gleichen Methode

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Indexfehler beim wiederholten Aufruf der gleichen Methode

    Hallo miteinander,

    ich habe zwei Methoden geschrieben, eine um die Metadaten von mp3s auszulesen und in Textdateien zu schreiben, die andere um diese Daten dann von der Platte in eine Klasse zu laden und dann in Listboxes anzuzeigen. Die erste ruft an ihrem Ende die zweite auf. Das funktioniert auch ganz gut so weit, bloss wenn ich während das Programm ausführe das Ganze ein zweites mal ausführe, kommt es zum Fehler "System.ArgumentOutOfRangeException: Der Index lag außerhalb des Bereichs. Er darf nicht negativ und kleiner als die Sammlung sein." in Zeile 78.
    Ich habs schon mit Content.Clear, bevor ich die zweite Methode ausführe versucht, kein Erfolg..

    Hier mein Code:

    VB.NET-Quellcode

    1. Private Sub MusikbibliothekAktualisieren()
    2. If MessageBox.Show("Dieser Befehl löscht die Musikdatenbank dieses Programms und durchsucht den angegebenen Ordner nach neuen MP3s. Dieser Vorgang kann eine Weile dauern. Möchtest du fortfahren?", "Aktualisierung der Datenbank", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
    3. FolderBrowserDialog1.ShowDialog()
    4. Dim mp3Path As String = FolderBrowserDialog1.SelectedPath
    5. If System.IO.File.Exists(Anwendungspfad & "\Tracknummern.txt") Then System.IO.File.Delete(Anwendungspfad & "\Tracknummern.txt")
    6. If System.IO.File.Exists(Anwendungspfad & "\Dateinamen.txt") Then System.IO.File.Delete(Anwendungspfad & "\Dateinamen.txt")
    7. If System.IO.File.Exists(Anwendungspfad & "\Interpreten.txt") Then System.IO.File.Delete(Anwendungspfad & "\Interpreten.txt")
    8. If System.IO.File.Exists(Anwendungspfad & "\Alben.txt") Then System.IO.File.Delete(Anwendungspfad & "\Alben.txt")
    9. If System.IO.File.Exists(Anwendungspfad & "\Musiktitel.txt") Then System.IO.File.Delete(Anwendungspfad & "\Musiktitel.txt")
    10. If System.IO.Directory.Exists(mp3Path) = True Then
    11. SplashScreen.ProgressBar1.Minimum = 0
    12. Dim Maximum As Integer = My.Computer.FileSystem.GetFiles(mp3Path, FileIO.SearchOption.SearchAllSubDirectories, "*mp3").Count
    13. SplashScreen.ProgressBar1.Maximum = Maximum
    14. SplashScreen.ProgressBar1.Value = 0
    15. Me.Enabled = False
    16. SplashScreen.Label1.Text = "Aktualisieren der Musikdatenbank..."
    17. SplashScreen.Show()
    18. For Each foundfile As String In My.Computer.FileSystem.GetFiles(mp3Path, FileIO.SearchOption.SearchAllSubDirectories, "*mp3")
    19. Dim FileMp3WithPath = foundfile
    20. m_UltraID3 = New UltraID3
    21. m_UltraID3.Read(FileMp3WithPath)
    22. If m_UltraID3.Artist = "" Or m_UltraID3.Album = "" Or m_UltraID3.Title = "" Then
    23. LeereID3 = LeereID3 + 1
    24. SplashScreen.ProgressBar1.Value = SplashScreen.ProgressBar1.Value + 1
    25. Else
    26. System.IO.File.AppendAllText(Anwendungspfad & "\Dateinamen.txt", foundfile & Environment.NewLine)
    27. Dim Tracknummer As String = CStr(m_UltraID3.TrackNum)
    28. If Tracknummer.Length < 2 Then
    29. Tracknummer = "0" & Tracknummer
    30. End If
    31. System.IO.File.AppendAllText(Anwendungspfad & "\Tracknummern.txt", Tracknummer & Environment.NewLine)
    32. System.IO.File.AppendAllText(Anwendungspfad & "\Interpreten.txt", m_UltraID3.Artist & Environment.NewLine)
    33. System.IO.File.AppendAllText(Anwendungspfad & "\Alben.txt", m_UltraID3.Album & Environment.NewLine)
    34. System.IO.File.AppendAllText(Anwendungspfad & "\Musiktitel.txt", m_UltraID3.Title & Environment.NewLine)
    35. SplashScreen.ProgressBar1.Value = SplashScreen.ProgressBar1.Value + 1
    36. If SplashScreen.ProgressBar1.Value = Maximum Then
    37. SplashScreen.Hide()
    38. Me.Enabled = True
    39. Me.BringToFront()
    40. Me.Focus()
    41. End If
    42. End If
    43. Next
    44. If LeereID3 > 0 Then MessageBox.Show("Es sind " & CStr(LeereID3) & " MP3s ohne ausreichende Metadaten gefunden worden. Diese wurden übersprungen. Um alle MP3s in die Datenbank zu laden, füge bitte mindestens Interpret, Album und Musiktitel hinzu, z.B. mit dem Programm MP3Tag, das kostenlos im Internet zu haben ist. Die Metadaten müssen als ID3v2.3 vorhanden sein, andere werden leider noch nicht unterstützt")
    45. End If
    46. Else
    47. MessageBox.Show("Bitte wähle einen gültigen Ordner aus!")
    48. End If
    49. MusikdatenbankInKlassenLaden()
    50. End Sub
    51. Private Sub MusikdatenbankInKlassenLaden()
    52. If System.IO.File.Exists(Anwendungspfad & "\Dateinamen.txt") Then
    53. Content = New List(Of ClassMP3Datei)
    54. URLs = New List(Of ClassSender)
    55. listAlleDateinamen.AddRange(IO.File.ReadAllLines(Anwendungspfad & "\Dateinamen.txt"))
    56. listAlleTracknummern.AddRange(IO.File.ReadAllLines(Anwendungspfad & "\Tracknummern.txt"))
    57. listAlleInterpreten.AddRange(IO.File.ReadAllLines(Anwendungspfad & "\Interpreten.txt"))
    58. listAlleAlben.AddRange(IO.File.ReadAllLines(Anwendungspfad & "\Alben.txt"))
    59. listAlleMusiktitel.AddRange(IO.File.ReadAllLines(Anwendungspfad & "\Musiktitel.txt"))
    60. For i = 0 To listAlleDateinamen.Count() - 1
    61. mp3 = New ClassMP3Datei(listAlleDateinamen(i), listAlleTracknummern(i), listAlleInterpreten(i), listAlleAlben(i), listAlleMusiktitel(i))
    62. Content.Add(mp3)
    63. Next
    64. ListenFüllen()
    65. Else
    66. MessageBox.Show("Du musst zuerst eine Musikdatenbank anlegen. Bitte wähle dazu im folgenden Dialog den Ordner mit deinen MP3-Dateien aus!")
    67. MusikbibliothekAktualisieren()
    68. End If
    69. End Sub

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

    If System.IO.Directory.Exists(mp3Path) = True Then -> Boolean-Vergleiche mit True sind überflüssig.

    Stichwort Debugging. Schau einfach mal, was i zum Zeitpunkt der Exception ist und wieviele Einträge zu diesem Zeitpunkt in den verwendeten Listen drin sind.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    kafffee schrieb:

    "System.ArgumentOutOfRangeException: Der Index lag außerhalb des Bereichs. Er darf nicht negativ und kleiner als die Sammlung sein." in Zeile 78.
    Debuggen halt.
    ein Index ist ausserhalb des gültigen bereichs.
    Was ist damit gemeint?
    Guck dir zeile#78 an:

    VB.NET-Quellcode

    1. mp3 = New ClassMP3Datei(listAlleDateinamen(i), listAlleTracknummern(i), listAlleInterpreten(i), listAlleAlben(i), listAlleMusiktitel(i))
    Was ist da der Index, und wo und wieso isser ausserhalb des gültigen bereichs?
    Das video wo das LokalFenster zum Debuggen gezeigt wurde, habich dir schon verlinkt. Also benutz nun das Lokalfenster, und guck nach, was da schief läuft.

    kafffee schrieb:

    VB.NET-Quellcode

    1. If System.IO.File.Exists(Anwendungspfad & "\Tracknummern.txt") Then System.IO.File.Delete(Anwendungspfad & "\Tracknummern.txt")

    kafffee schrieb:

    VB.NET-Quellcode

    1. System.IO.File.AppendAllText(Anwendungspfad & "\Tracknummern.txt", Tracknummer & Environment.NewLine)

    kafffee schrieb:

    VB.NET-Quellcode

    1. listAlleDateinamen.AddRange(IO.File.ReadAllLines(Anwendungspfad & "\Dateinamen.txt"))
    Das ist pure Redundanz.
    Da kannst Du Dir jeweils eine Prozedur zu machen oder eine separate Klasse, der Du die betreffenden Controls und Parameter übergibst. Was von beiden hängt von weiteren ähnlichen Code-Stellen ab.
    Eine separate Klasse wäre besser pflegbar.
    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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Habs hinbekommen. Der Index war doppelt so hoch, wie er sein sollte, damit war klar. Irgendwo ist da was doppelt eingelesen worden. Also hab ich mal überlegt, wo, und bin daruf gekommen, dass ich die Listen in jedem Aufruf von MusikdatenbankInKlasssenLaden() erstmal leeren muss...

    @RodFromGermany
    Ok ich muss mir mal in einer ruhigen Minute wenn ich den Kopf hab überlegen wie du das meinst. Wenn ich noch Rückfragen hab meld ich mich :)

    @ErfinderDesRades
    Das Video ist super, sehr hilfreich. Hatte nur neulich nicht den Kopf dazu das direkt mal anzusehen..