C# Plötzlicher/spontaner Fehler im Programm

thelch

Cadet 3rd Year
Registriert
Nov. 2009
Beiträge
52
Hallo ich habe ein Programm in C# geschrieben, welches bis jetzt ohne Fehler funktionierte.

Jetzt musste ich jedoch den Rechner auf dem das Programm läuft neu aufsetzen.

Seit dem kommt bei einigen durchläufen ein Fehler, jedoch nicht immer.

Leider kann ich mit der Fehlermeldung nicht viel anfangen, außer das es um die lenge von dem String geht.

Fehlermeldung:

Code:
Informationen über das Aufrufen von JIT-Debuggen
anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.

************** Ausnahmetext **************
System.ArgumentOutOfRangeException: Der Index und die Länge müssen sich auf eine Position in der Zeichenfolge beziehen.
Parametername: length
   bei System.String.Substring(Int32 startIndex, Int32 length)
   bei WindowsFormsApplication1.Getränke.eingabe_box_KeyDown(Object sender, KeyEventArgs e)
   bei System.Windows.Forms.Control.OnKeyDown(KeyEventArgs e)
   bei System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
   bei System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
   bei System.Windows.Forms.Control.WmKeyChar(Message& m)
   bei System.Windows.Forms.Control.WndProc(Message& m)
   bei System.Windows.Forms.TextBoxBase.WndProc(Message& m)
   bei System.Windows.Forms.TextBox.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)


************** Geladene Assemblys **************
mscorlib
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.34014 built by: FX45W81RTMGDR.
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll.
----------------------------------------
LZ44
    Assembly-Version: 1.0.0.0.
    Win32-Version: 1.0.0.0.
    CodeBase: file:///C:/Users/Fabian/AppData/Local/Apps/2.0/5DZC8VP2.LD5/3YPTOGAW.CO1/lz44..tion_592a06ceafe83fbe_0000.005f_cb10a390818e9332/LZ44.exe.
----------------------------------------
System.Windows.Forms
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.33440 built by: FX45W81RTMREL.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
----------------------------------------
System.Drawing
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.33440 built by: FX45W81RTMREL.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
----------------------------------------
System
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.34003 built by: FX45W81RTMGDR.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll.
----------------------------------------
System.Configuration
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.33440 built by: FX45W81RTMREL.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll.
----------------------------------------
System.Xml
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.33440 built by: FX45W81RTMREL.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll.
----------------------------------------
mscorlib.resources
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.33440 built by: FX45W81RTMREL.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_de_b77a5c561934e089/mscorlib.resources.dll.
----------------------------------------
System.Windows.Forms.resources
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.0.30319.33440 built by: FX45W81RTMREL.
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
----------------------------------------

************** JIT-Debuggen **************
Um das JIT-Debuggen (Just-In-Time) zu aktivieren, muss in der
Konfigurationsdatei der Anwendung oder des Computers
(machine.config) der jitDebugging-Wert im Abschnitt system.windows.forms festgelegt werden.
Die Anwendung muss mit aktiviertem Debuggen kompiliert werden.

Zum Beispiel:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

Wenn das JIT-Debuggen aktiviert ist, werden alle nicht behandelten
Ausnahmen an den JIT-Debugger gesendet, der auf dem
Computer registriert ist, und nicht in diesem Dialogfeld behandelt.

Wie kann ich den Fehler beheben?
Warum tritt er erst jetzt auf und dann nur sporadisch?

Programmcode:
Code:
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace WindowsFormsApplication1
{
    
    public partial class Getränke : Form
    {
        

        public Getränke()
        {
            InitializeComponent();
            using (StreamWriter erstellen = new StreamWriter(Global.FILENAME_RUNDE))
                erstellen.WriteLine("");
        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void eingabe_box_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                string searchfor = Convert.ToString(eingabe_box.Text);

                string line;
                name.Text = searchfor;

                if (Global.global_line < 1)
                {
                    Global.global_barcode = "";
                    Global.global_guthaben = "";
                    Global.global_user = "";
                    Global.global_wert = "";
                    warnung.Visible = false;

                }
                
                
                

                using (StreamReader tr = new StreamReader(Global.FILENAME_USER))
                using (StreamReader bu = new StreamReader(Global.FILENAME_WERTE))


                    // Wenn kein User eingetragen, wird Barcode auf Zusammengehörigkeit mit einem User geprüft
                    if (Global.global_user == "")
                    {

                        {
                            while ((line = tr.ReadLine()) != null)
                            {
                                Global.global_line++;
                                string[] splittedString = line.Split('#');

                                if (splittedString[0] == searchfor)
                                {
                                    name.Text = splittedString[1];
                                    guthaben_form1.Text = splittedString[2];
                                    Global.global_barcode = splittedString[0];
                                    Global.global_user = splittedString[1];
                                    Global.global_guthaben = splittedString[2];
                                    Global.global_wert = splittedString[2];
                                    double guthaben = Convert.ToDouble(Global.global_guthaben);

                                    DateTimePicker datetime = new DateTimePicker();
                                    Global.uhrzeit = datetime.Value.ToString("dd.MM.yy HH:mm:ss");
                                    if (guthaben >= 0)
                                    {
                                       // using (StreamWriter file = new StreamWriter(Global.FILENAME_LOG, true))
                                        //    file.WriteLine("[{0}] {1} hat noch {2}€ Guthaben!", Global.uhrzeit, Global.global_user, Global.global_guthaben);
                                    }
                                    else
                                    {
                                        using (StreamWriter file = new StreamWriter(Global.FILENAME_LOG, true))
                                            file.WriteLine("[{0}] {1} hat Schulden! Bitte Umgehend Bezahlen!", Global.uhrzeit, Global.global_user, Global.global_guthaben);
                                    }
                                    eingabe_box.Text = "";
                                    //double guthaben = Convert.ToDouble(global_guthaben);
                                    // GUthaben kleiner 5€ dann warnung einblenden
                                    if (guthaben < 0)
                                    {
                                        warnung.Visible = true;
                                        ausgabeFenster.BackColor = Color.Red;
                                        ausgabeFenster.ForeColor = Color.White;
                                    }
                                    else
                                    {
                                        warnung.Visible = false;
                                        ausgabeFenster.BackColor = Color.White;
                                        ausgabeFenster.ForeColor = Color.Black;
                                    }

                                    Global._t = new Timer();
                                    Global._t.Interval = 1000;
                                    Global._t.Tick += new EventHandler(_t_Tick);
                                    Global._t.Start();
                                    Global._ticks = 0;
                                }
                                else
                                {
                                    eingabe_box.Text = "";
                                }
                            }
                        }
                    }
                    // Dem User wird ein Getränk zugewiesen
                    else if (Global.global_user != "")
                    {

                        while ((line = bu.ReadLine()) != null)
                        {
                            string[] splittedWerte = line.Split('#');
                            Global.global_line = 0; // Wenn die Variable am Schleifenende == 0 ist wird der Personen-Barcode gecheckt

                            // Überprüfen ob der Getränkecode funktioniert.
                            if (splittedWerte[0] == searchfor)
                            {

                                double guthaben = 0;
                                
                                guthaben = Convert.ToDouble(Global.global_guthaben);
                                Global.wert = Convert.ToDouble(splittedWerte[2]);
                                guthaben = guthaben + Global.wert;
                                Global.global_guthaben = Convert.ToString(guthaben);
                                // Festlegen ob Aufladung oder Abbuchung

                                DateTimePicker datetime = new DateTimePicker();
                                Global.uhrzeit = datetime.Value.ToString("dd.MM.yy HH:mm:ss");

                                using (StreamWriter file = new StreamWriter(Global.FILENAME_LOG, true))
                                    if (Global.wert < 0)
                                    {
                                        if (Global.wert == -20)
                                        {
                                            Runde.Visible = true;
                                            runden_box.Visible = true;
                                            runden_box.ForeColor = Color.Red;
                                            spender.Visible = true;
                                            spender.ForeColor = Color.Red;

                                            Global.runde_user = Global.global_user;
                                            file.WriteLine("[{0}] {1} hat eine Runde Gegeben!", Global.uhrzeit, Global.runde_user);
                                           // runden_box.Text = "Dank für die Runde geht an:" + Environment.NewLine + "test"+ Global.runde_user;

                                            using (StreamWriter round = new StreamWriter(Global.FILENAME_RUNDE, true))
                                                round.WriteLine(Global.runde_user);

                                        
                                            using (StreamReader sr = File.OpenText(Global.FILENAME_RUNDE))
                                            {
                                                String ausgabe;
                                                while ((ausgabe = sr.ReadLine()) != null)
                                                {
                                                    runden_box.Text = sr.ReadToEnd();
                                                    //runden_box.SelectionStart = runden_box.Text.Length;
                                                    //runden_box.ScrollToCaret();

                                                }

                                            }

                                            Global.rnd = new Timer();
                                            Global.rnd.Stop();
                                            Global.rnd.Interval = 1000;
                                            Global.rnd.Tick += new EventHandler(rnd_Tick);
                                            Global.rnd.Start();
                                            Global.rnd_ticks = 0;
                                        }
                                        else
                                        {
                                            file.WriteLine("[{0}] {1} hat {2} getrunken", Global.uhrzeit, Global.global_user, splittedWerte[1]);
                                        }
                                    }
                                    else if (Global.wert > 0)
                                    {

                                        Form4 frm = new Form4();
                                        frm.Show();


                                    }


                                // Änderungen in der Textdatei speichern
                                StreamReader einfuegen = File.OpenText(Global.FILENAME_USER);
                                string inhalt = einfuegen.ReadToEnd();
                                einfuegen.Close();
                                tr.Close();



                                string[] guthaben_begrenzung = Global.global_guthaben.Split(',');
                                string teil1 = guthaben_begrenzung[0];
                                string teil2 = guthaben_begrenzung[1];
                                string begrenzung;
                                
                                begrenzung = teil2;
                                Global.global_guthaben = guthaben_begrenzung[0]+","+begrenzung;



                                string alt = Global.global_barcode + "#" + Global.global_user + "#" + Global.global_wert;
                                string neu = Global.global_barcode + "#" + Global.global_user + "#" + Global.global_guthaben;


                                inhalt = inhalt.Replace(alt, neu);
                                StreamWriter speichern = File.CreateText(Global.FILENAME_USER);
                                speichern.Write(inhalt);
                                speichern.Close();
                                // Ende des Speicherns
                                Global.global_wert = Global.global_guthaben;
                                eingabe_box.Text = ""; //Textbox wird geleert
                                name.Text = Global.global_user; // Name anpassen   
                                guthaben_form1.Text = Global.global_guthaben; // Neues Guthaben ausgeben
                                Global.global_line = 1;
                                break;
                                Global._t.Stop();
                                Global._t = new Timer();
                                Global._t.Interval = 1000;
                                Global._t.Tick += new EventHandler(_t_Tick);
                                Global._t.Start();
                                Global._ticks = 0;
                            }
                            else
                            {
                                eingabe_box.Text = "";
                                
                            }
                        }
                        // Vermeidet das 2. benötigte Enter fals es kein getränkbarcode ist
                        if (Global.global_line < 1)
                        {
                            Global.global_barcode = "";
                            Global.global_guthaben = "";
                            Global.global_user = "";
                            Global.global_wert = "";
                            //SendKeys.Send("{ENTER}");

                            while ((line = tr.ReadLine()) != null)
                            {
                                Global.global_line++;
                                string[] splittedString = line.Split('#');

                                if (splittedString[0] == searchfor)
                                {
                                    name.Text = splittedString[1];
                                    guthaben_form1.Text = splittedString[2];
                                    Global.global_barcode = splittedString[0];
                                    Global.global_user = splittedString[1];
                                    Global.global_guthaben = splittedString[2];
                                    Global.global_wert = splittedString[2];
                                    double guthaben = Convert.ToDouble(Global.global_guthaben);

                                    DateTimePicker datetime = new DateTimePicker();
                                    Global.uhrzeit = datetime.Value.ToString("dd.MM.yy HH:mm:ss");

                                    if (guthaben >= 0)
                                    {
                                       // using (StreamWriter file = new StreamWriter(Global.FILENAME_LOG, true))
                                        //    file.WriteLine("[{0}] {1} hat noch {2}€ Guthaben!", Global.uhrzeit, Global.global_user, Global.global_guthaben);
                                    }
                                    else
                                    {
                                        using (StreamWriter file = new StreamWriter(Global.FILENAME_LOG, true))
                                            file.WriteLine("[{0}] {1} hat Schulden! Bitte Umgehend Bezahlen!", Global.uhrzeit, Global.global_user, Global.global_guthaben);
                                    } 
                                    eingabe_box.Text = "";
                                    
                                    if (guthaben < 0)
                                    {
                                        warnung.Visible = true;
                                        ausgabeFenster.BackColor = Color.Red;
                                        ausgabeFenster.ForeColor = Color.White;
                                    }
                                    else
                                    {
                                        warnung.Visible = false;
                                        ausgabeFenster.BackColor = Color.White;
                                        ausgabeFenster.ForeColor = Color.Black;
                                    }
                                    Global._t.Stop();
                                    Global._t = new Timer();
                                    Global._t.Interval = 1000;
                                    Global._t.Tick += new EventHandler(_t_Tick);
                                    Global._t.Start();
                                    Global._ticks = 0;
                                }
                            }
                        }
                    }
                    
            }
            if (!File.Exists(Global.FILENAME_LOG))
            {
                Console.WriteLine("{0} existiert nicht!", Global.FILENAME_LOG);
            }
            using (StreamReader sr = File.OpenText(Global.FILENAME_LOG))
            {
                String ausgabe;
                while ((ausgabe = sr.ReadLine()) != null)
                {
                    ausgabeFenster.Text = sr.ReadToEnd();
                    ausgabeFenster.SelectionStart = ausgabeFenster.Text.Length;
                    ausgabeFenster.ScrollToCaret();

                }

            }
        }

        void rnd_Tick(object sender, EventArgs e)
        {
            Global.rnd_ticks++;

            if (Global.rnd_ticks == 10000)
            {
                runden_box.Visible = false;
                Runde.Visible = false;
                spender.Visible = false;
                
                System.IO.File.Delete(Global.FILENAME_RUNDE);
                //System.IO.File.Create(Global.FILENAME_RUNDE);

                using (StreamWriter erstellen = new StreamWriter(Global.FILENAME_RUNDE))
                    erstellen.WriteLine("");
            }
        }

        private void hinzufügenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            anlage_nutzer frm = new anlage_nutzer();
            frm.Show();
        }

        private void hinzufügenToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            getraenke_anlegen frm = new getraenke_anlegen();
            frm.Show();
        }

        private void übersichtToolStripMenuItem_Click(object sender, EventArgs e)
        {
            uebersicht_Getraenke frm = new uebersicht_Getraenke();
            frm.Show();
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            menuStrip1.Visible = true;
        }

        private void pictureBox1_DoubleClick(object sender, EventArgs e)
        {
            menuStrip1.Visible = false;
        }

        void _t_Tick(object sender, EventArgs e)
        {
            Global._ticks++;
            label5.Text = Convert.ToString(Global._ticks);
            if (Global._ticks == 30)
            {

                Global._t.Stop();
               // _t.Enabled = false;
                Global._ticks = 0;
                Global.global_barcode = "";
                Global.global_guthaben = "";
                Global.global_user = "";
                Global.global_wert = "";
                eingabe_box.Text = "";
                guthaben_form1.Text = "";
                SendKeys.Send("{ENTER}");
                warnung.Visible = false;
                ausgabeFenster.BackColor = Color.White;
                ausgabeFenster.ForeColor = Color.Black;
            }
        }

        private void label4_Click(object sender, EventArgs e)
        {

        }

        private void testToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Form4 frm = new Form4();
            frm.Show();
        }

        private void changelogToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form5 frm = new Form5();
            frm.Show();
        }

       
   


    }
}
public class Global
{

    public const string FILENAME_LOG = @"g:\\44\\logfile.lz44";
    public const string FILENAME_USER = @"g:\\44\user.lz44";
    public const string FILENAME_WERTE = @"g:\\44\werte.lz44";

    public const string FILENAME_CHLOG = @"g:\\44\\changelog.txt";
    public const string FILENAME_RUNDE = @"g:\\44\\runde.lz44";

    public static string uhrzeit = "";
    public static string global_user = "";
    public static string global_barcode = "";
    public static string runde_user = "";

    public static string global_guthaben = "";
    public static string global_wert = "";
    public static int global_line = 0;
    public static double wert = 0;

    public static Timer _t;
    public static  int _ticks = 0;

    public static Timer rnd;
    public static int rnd_ticks = 0;

    
}

Danke für eure Hilfe :-)
 
Hi,

Setze Breakpoints, behandle die Eingabe korrekt und der Fehler hat sich behoben. Du kannst nicht einfach einen Substring nutzen und weiter verarbeiten ohne vorher Prüfungen zu machen, das ist sehr schlechter Stil. Im Zweifel: Pack in die aufgeführte Methode wo der Fehler auftritt ein "try catch" und behandle die Exception. Besser wäre es aber, vorher schon abzufangen, wenn die Startbedingungen für deine Verarbeitung nicht passen.

VG,
Mad
 
Steht doch in der Exception:
System.ArgumentOutOfRangeException: Der Index und die Länge müssen sich auf eine Position in der Zeichenfolge beziehen.
Parametername: length
bei System.String.Substring(Int32 startIndex, Int32 length)

Eventuell ist auch dein Sourcecode nicht mehr synchron mit der DLL/EXE. Passiert auch ab und zu so etwas!
 
Danke schon mal für den Vorschlag mit try catch.
Aber damit kann ich ja nur sagen was im Fehlerfall passieren soll und nicht den Fehler verhindern , so hab ich das verstanden.

Was mich halt wundert ist, dass der Fehler jetzt auf einmal nach nem Halben Jahr auftritt und nicht von Anfang an.
 
Zurück
Oben