Der Index war außerhalb des Arraybereichs

  • VB.NET

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von Fusseldieb.

    Das ist ein eindeutiger Fall von "Grundlagen nochmal ansehen". Das Problem an sich ist ja schnell beseitigt (eine If-Abfrage) aber die Tatsache, dass du das nicht selbständig lösen kannst (auch @programmer71 !) spricht dafür, dass viel Wissen fehlt.

    Man kann die IndexOutOfRangeException schnell mittels If-Abfrage loswerden. Aber wie geht es dann weiter? Offensichtlich war der Eingabewert der Methode ungeeignet sodass kein passender Rückgabewert erzeugt werden kann. Was die Methode im 'funktionierenden' Fall zurückgibt ist klar, was aber wenn das Fehlverhalten auftritt? Ein Leerstring/Nothing bzw ein vorgegebener Wert wären möglich - oder eben eine Exception. In jedem Fall muss der Code der die Methode aufruft darauf reagieren können.

    (Im Prinzip ist das wie bei einer Listbox zu gestalten, dort gibt .SelectedIndex den Wert -1 zurück wenn kein Item selectiert ist, bei dir sind es eben Strings)
    Okay das mit der If-Abfrage ist ja gut aber was sage ich wenn die Abfrage wahr ist.

    VB.NET-Quellcode

    1. Private Function GetReqFile(ByVal recMessage As String) As String
    2. Dim lines() As String = recMessage.Split(CChar(vbNewLine))
    3. Dim line1 As String = lines(0)
    4. Dim getItems() As String = line1.Split(" "c)
    5. If getItems.Length < 2 Then
    6. End If
    7. Dim reqFile As String = getItems(1)
    8. Return reqFile.Remove(0, 1)
    9. End Function


    Ist die Abfrage überhaupt richtig platziert?

    @FreakJNS:
    Ja das ist mir klar, das ist auch nicht in Ordnung das ich mich gleich auf die großen Sachen stürze aber ich mache das damit ich mich gleich mit den wichtigen Dingen beschäftigen kann, wenn zum Beispiel jetzt mein Problem gelöst wird werde ich wissen wie man "Der Index war außerhalb des Arraybereichs" behebt, die kleinen Fehler in den Grundlagen lassen sich schnell nachschlagen aber sowas ist dann schon etwas blöder für mich.
    Bitte keine VB-Fragen üb... Ach scheiß drauf, mich fragt ja eh keiner.

    Artentus schrieb:

    Dann machst du deine Fehlerbehandlung. Entweder mit ner Exception oder indem du irgend einen eindeutigen Wert zurückgibst, der dem Aufrufer signalisiert, dass etwas schiefgelaufen ist.


    Wenn ich zum Beispiel eine Message-Box ausgeben lasse stürzt das Programm nach dem Klick ja trotzdem ab und das soll ja nicht sein :/
    Bitte keine VB-Fragen üb... Ach scheiß drauf, mich fragt ja eh keiner.
    Natürlich! Du musst raus aus der Methode.
    Hier mal ein beispiel mit einer Exception:

    VB.NET-Quellcode

    1. Private Function GetReqFile(ByVal recMessage As String) As String
    2. Dim lines() As String = recMessage.Split(CChar(vbNewLine))
    3. Dim line1 As String = lines(0)
    4. Dim getItems() As String = line1.Split(" "c)
    5. If getItems.Length < 2 Then
    6. Throw New ArgumentException("Die übergebene Zeichenfolge war nicht im richtigen Format.")
    7. End If
    8. Dim reqFile As String = getItems(1)
    9. Return reqFile.Remove(0, 1)
    10. End Function

    Vom Aufrufer aus musst du dann auf die Exception reagieren.
    Als alternative zu Artentus Lösung. TryCatch ist - wenn der Catch-Fall eintritt - recht langsam. Hier würde ich so vorgehen, macht bei wenigen Methodenaufrufen aber keinen wirklichen Unterschied.

    VB.NET-Quellcode

    1. Public Const GETREQFILE_ERROR as string = "fehler" 'Muss eindeutig sein! Wenn die Methode diesen wert zurückgeben könnte ist die Funktionsfähigkeit nicht gewährleistet und du müsstest die TryCatch-Variante nehmen
    2. Private Function GetReqFile(ByVal recMessage As String) As String
    3. Dim lines() As String = recMessage.Split(CChar(vbNewLine))
    4. Dim line1 As String = lines(0)'Hier müsstest du eigentlich auch aufpassen!
    5. Dim getItems() As String = line1.Split(" "c)
    6. If getItems.Length < 2 Then
    7. 'Da ist was schief gelaufen
    8. return GETREQFILE_ERROR ' alternativ: throw new Exception("da ist murks passiert") ' wird dann von der aufrufenden Methode mittels TryCatch abgefangen und weiterverarbeitet - vorsicht relativ langsam
    9. else
    10. 'array hat mindestens 2 items, es kann normal verfahren werden
    11. Dim reqFile As String = getItems(1)
    12. Return reqFile.Remove(0, 1)
    13. End If
    14. End Function


    Aufruf der Methode:

    VB.NET-Quellcode

    1. dim result as string = getReqFile(...)
    2. if result.equals(GETREQFILE_ERROR) then
    3. 'Fehler in Mehtode passiert, entsprechend reagieren
    4. else
    5. 'kein Fehler, normal weiterarbeiten
    6. end if
    Hey,

    ich hab Dir doch geschrieben, ich meld mich morgen bei Dir. Lass Dich jetzt mal nicht verunsichern. Ich hab schließlich den Code für diesen "Ranz-WebServer" auf die Öffentlichkeit losgelassen. Ich werd morgen hier für Jedermann eine passende Lösung präsentieren.

    @require Schick mir bitte mal Dein gesamtes Projekt, da ich den QuellCode für dieses Programm leider nicht mehr habe....
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Für alle Beteiligten.

    Der Fehler lag daran, dass nicht auf einen Verbindungsabbruch reagiert wurde. Schließt der Browser die Verbindung zum Server, gibt die Receive-Funktion des Sockets 0 zurück. Die erhaltene Nachricht vom Browser wurde somit zu "" und das kann nur knallen.

    Der Fehler wurde behoben, indem man einfach prüft, ob 0 Bytes (also Verbindungsabbruch) gesendet wurden. Wenn ja, Client schließen und gut.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ich weiss, dass dieser Thread ein bisschen alt ist, aber wie genau hast du das gelöst? Also welchen Code hast du verwendet?

    Danke :)

    ErfinderDesRades - Moderator - Notiz: Bitte stell neue Fragen in neuen Threads
    --> closed



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