none
IndexOutOfrangeException wurde nicht behandelt RRS feed

  • Frage

  • Hallo,

    wenn ich 3 Bedingungen in if Schleife eingebe stürzt das Programm ab und zeigt: IndexOutOfrangeException wurde nicht behandelt. Woran liegt es bitte?

    hier ist mein Code:

     private void button1_Click(object sender, EventArgs e)
            {
    
    
                eingabe = textBox1.Text;
    
    
                if (eingabe[0] == eingabe[3] && eingabe[1] == eingabe[2] || eingabe[0] == eingabe[6] && eingabe[1] == eingabe[5] && eingabe[2] == eingabe[4] || eingabe[0] == eingabe[4] && eingabe[1] == eingabe[3])
                    
                {
                    rechne();
                }
    
                else
                {
                    rechne1();
                }
            }



    Mittwoch, 16. Januar 2019 12:44

Antworten

Alle Antworten

  • Hallo,

    mit welchem Datentyp ist die Variable "eingabe" deklariert; ich vermute als "string"? In der If Bedingung (nicht Schleife) verwendest Du es wie ein Array, wohl um an die einzelnen Zeichen zu kommen.

    Hat die Eingabe nur 6 Buchstaben, schlägt eingabe[6] fehl, weil dieses 7te Zeichen nicht vorhanden ist.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    Mittwoch, 16. Januar 2019 12:54
  • Hallo,

    mit welchem Datentyp ist die Variable "eingabe" deklariert; ich vermute als "string"? In der If Bedingung (nicht Schleife) verwendest Du es wie ein Array, wohl um an die einzelnen Zeichen zu kommen.

    Hat die Eingabe nur 6 Buchstaben, schlägt eingabe[6] fehl, weil dieses 7te Zeichen nicht vorhanden ist.



    genau das! vielen Dank für Deine schnelle Antwort.

    Wie kann ich bitte das Problem lösen? Ich meine, damit die eingabe[6] nicht fehlschlägt, wenn weitere Zeichen nicht vorhanden sind?



    Mittwoch, 16. Januar 2019 13:10
  • Hi,

    greif eben nicht auf Elemente zu, die es nicht gibt.

    Soweit ich das verstanden habe, muss dein String genau bzw. mind. 7 Zeichen beinhalten? Falls ja, prüf das vorher.

    eingabe = textBox1.Text;
    if( eingabe.Length >= 7 ) {
        ...
    }


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 16. Januar 2019 13:47
    Moderator
  • Hi,

    greif eben nicht auf Elemente zu, die es nicht gibt.

    Soweit ich das verstanden habe, muss dein String genau bzw. mind. 7 Zeichen beinhalten? Falls ja, prüf das vorher.

    eingabe = textBox1.Text;
    if( eingabe.Length >= 7 ) {
        ...
    }


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    - IT Beratung, Softwareentwicklung, Remotesupport

    Hallo, vielen Dank für deine Antwort. Nein, es geht um Palindrom, aber Deine Lösung ist ein Denkstoß für meine Experiment zu hause.

    Wenn in Input das Wort "Anna" steht, es wird geprüft, ob eingabe[0] == eingabe[4], also ob der erste Buchstabe "a" ist gleich die letzte "a"  && eingabe[1] == eingabe[2], also ob (a=a und n=n) , Ausgabe soll("Palindrom ist richtig") sein… ich bin irgendwie überzeugt, dass meine Lösung passt nicht, denn die Indexe werden verglichen und in mehreren If Statements geprüft, was wahrscheinlich zu dem o.g. Fehler führen könnte?

    Mittwoch, 16. Januar 2019 18:35
  • Hi,
    hier mal eine Mini-Demo:

            var s = "Anna";
    
            bool res = true;
            for (int i = 0; i < s.Length / 2; i++) res &= char.ToLower(s[i]) == char.ToLower(s[s.Length - i - 1]);
    
            Console.WriteLine(res);


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 16. Januar 2019 19:18
  • Hi,

    hier noch eine kleine Demo mit Linq (using System.Linq;) 

    string deinString = "Anna";
    bool result = deinString.ToLower().SequenceEqual(deinString.ToLower().Reverse());

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Mittwoch, 16. Januar 2019 19:24
  • es geht um Palindrom

    Dann nimm die Strings.​Str​Reverse (String) Method für den Vergleich

    if (eingabe == Strings.StrReverse(eingabe))
    { // Ist ein Palindrom
    ... 
    }


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 17. Januar 2019 06:41
  • Hi,
    hier mal eine Mini-Demo:

            var s = "Anna";
    
            bool res = true;
            for (int i = 0; i < s.Length / 2; i++) res &= char.ToLower(s[i]) == char.ToLower(s[s.Length - i - 1]);
    
            Console.WriteLine(res);


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks


    so ein beautiful Code ^^ Danke schön
    Freitag, 18. Januar 2019 10:08
  • Hi,

    hier noch eine kleine Demo mit Linq (using System.Linq;) 

    string deinString = "Anna";
    bool result = deinString.ToLower().SequenceEqual(deinString.ToLower().Reverse());

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP


    Der Code ist super. Vielen Dank dafür.
    Freitag, 18. Januar 2019 10:20
  • es geht um Palindrom

    Dann nimm die Strings.​Str​Reverse (String) Method für den Vergleich

    if (eingabe == Strings.StrReverse(eingabe))
    { // Ist ein Palindrom
    ... 
    }


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    private void button1_Click(object sender, EventArgs e)
            {
                string ausgabe = "Palindrom ist richtig";
                string eingabe = textBox1.Text;
                if (eingabe != Strings.StrReverse(eingabe))
                {
                    ausgabe = "Palindrom ist nicht richtig";
    
    
                }
                textBox2.AppendText("ausgabe");
            }

    Leider funktioniert StrReverse nicht? :( 
    Freitag, 18. Januar 2019 10:37

  • Leider funktioniert StrReverse nicht? :( 

    Es funktioniert schon. Genau wie die anderen Lösungen berücksichtigt "StrReverse" auch die Groß/Kleinschreibung.

    Wenn du es so änderst, liefert es das gleiche Ergebnis, wie die anderen:

    if (deinString.ToLower() == Strings.StrReverse(deinString.ToLower()))
    { // Ist ein Palindrom
    	
    }

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Freitag, 18. Januar 2019 10:58
  • Es geht auch Explizit:

    bool bPalindrom = String.Equals(new string(meinString.Reverse().ToArray()), meinString, StringComparison.OrdinalIgnoreCase);


    - Gruß Florian

    Freitag, 18. Januar 2019 12:52
  • namespace SequenceequelTest
    {
        public partial class Form1 : Form
        {
            string eingabe1;
            bool x;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                textBox2.ForeColor = Color.Green;
                string ausgabe = "Palindrom ist richtig!";
    
                string eingabe = textBox1.Text.ToLower();
                string meinTriming = eingabe.Replace(" ", "");
                for (int i = 0; i < (meinTriming.Length / 2); i++)
                {
                    if (eingabe == "")
                    {
                        textBox1.AppendText("please enter a palindrom word");
                    }
                    if (meinTriming[i] != meinTriming[meinTriming.Length - i - 1])
                    {
                        
    
    
                        textBox2.ForeColor = Color.Red;
                        ausgabe = "Palindrom ist nicht richtig!";
                    }
                }
                textBox2.AppendText(ausgabe);
            }
        }
    }

    @ Florian:

    eine schöne aber für einen Anfänger sehr komplizierte Lösung. Danke schön ^^ 

    so sieht meine eigene Lösung jtzt aus

    Leider erkannt c# den Schlüsselwort nicht :(


    Freitag, 18. Januar 2019 13:49
  • Hi,

    ich habe deine Lösung mal überarbeitet. Deine Abfrage " if (eingabe == "") " wird nie erreicht, wenn  meinTriming == "" ist, weil die Schleife dann nie durchlaufen wird.

    Weiter habe ich auf "meinTriming" verzichtet. 

    Was ich auch nicht verstehe, warum nimmst du "AppendText" ?? Das fügt ein einen Text an.

            private void button3_Click(object sender, EventArgs e)
            {
                textBox4.ForeColor = Color.Green;
                string ausgabe = "Palindrom ist richtig!";
    
                string eingabe = textBox3.Text.Trim().ToLower();
                if (eingabe != "")
                {
                    for (int i = 0; i < (eingabe.Length / 2); i++)
                    {
                        if (eingabe[i] != eingabe[eingabe.Length - i - 1])
                        {
                            textBox4.ForeColor = Color.Red;
                            ausgabe = "Palindrom ist nicht richtig!";
                        }
                    }
                    textBox4.Text = ausgabe;
                }
                else
                {
                    textBox3.Text = "please enter a palindrom word";
                }
            }

    PS: welches Schlüsselwort erkennt C# nicht?

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP


    Freitag, 18. Januar 2019 20:05
  • Hi Stefan,
    ich würde noch ein break einfügen, da das erstmalige Auftreten einer Ungleichheit ausreichend ist für "Palindrom ist nicht richtig!".

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    Freitag, 18. Januar 2019 21:55
  • Hi Peter,

    du hast recht. Das sollte man immer so machen. Ich vernachlässige das auch (leider) manchmal...

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Montag, 21. Januar 2019 11:49