2016-06-30 10 views
1

versucht, meine kleine Windows-Formular-App fertig zu schreiben, die ich in C# geschrieben habe. Ich baue es ohne Fehler für die Variable "e", die nie verwendet wird.
Wenn ich das Programm nach dem Erstellen ausführen, passiert nichts und in der Ereignisanzeige erhalte ich einen .net Laufzeitfehler (unten eingefügt). Code:C# /. Net Fehler System.NullreferenceException

namespace WindowsFormsApplication2 
{ 
    public partial class Form1 : Form 
    { 
     private Thread thread; 

     public Form1() 
     { 
      InitializeComponent(); 
      richTextBox1.Text = "Epic pinger"; 

      Form1.ActiveForm.FormClosing += new FormClosingEventHandler(Form1_Closing); 
     } 
     private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
     { 
      if (thread != null) 
      { 
       thread.Abort(); 
      } 
     } 


     public void ping() 
     { 
      string textb1 = textBox1.Text; 
      try 
      { 
       while (true) 
       { 

        if (textb1 == "") 
        { 
         return; 
        } 

        using (Ping p = new Ping()) 
        { 
         //Konfigurerings boksene int/strings 
         string msStørreKonf2 = msKonfig2.Text; 
         string msStørre = textBox2.Text; 
         int msStørst = 100; 
         int msKonf2t = 100; 
         Int32.TryParse(msStørreKonf2, out msKonf2t); 
         Int32.TryParse(msStørre, out msStørst); 


         this.Invoke((MethodInvoker)delegate 

         { 
          try 
          { 
           listView1.Items.Add(p.Send(textBox1.Text).RoundtripTime.ToString() + "ms\n"); 
           if (p.Send(textBox1.Text).RoundtripTime > msStørst) { Console.Beep(1500, 400); } //konfig boks 1 
           if (p.Send(textBox1.Text).RoundtripTime > msKonf2t) { Console.Beep(6500, 700); } //konfig boks 2 
           listView1.EnsureVisible(listView1.Items.Count - 1); 
          } 
          catch (PingException e) 
          { 
           Console.Beep(5000, 100); 
           richTextBox1.AppendText("Error med ping addressen eller pip konfigurasjon! "); 
          } 
         }); 
        //Søvetid, henter input fra tidsBox. 
         string tidPingString = tidsBox.Text; 
         int tidPing = 1000; 
         Int32.TryParse(tidsBox.Text, out tidPing); 
         Thread.Sleep(tidPing); 
         // testing: 



        } 
       } 
      } 
      catch (ThreadAbortException e) 
      { 
       // Ska vær blank! 
      } 

     } 


     private void button1_Click(object sender, EventArgs e) 
     { 
      if (thread != null && thread.IsAlive) 
      { 
       thread.Abort(); 
       listView1.Items.Add("|"); 
      } 
      else 
      { 
       thread = new Thread(new ThreadStart(ping)); 
       thread.Start(); 
      } 
     } 

Fehler XML-Ansicht:

- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> 
- <System> 
    <Provider Name=".NET Runtime" /> 
    <EventID Qualifiers="0">1026</EventID> 
    <Level>2</Level> 
    <Task>0</Task> 
    <Keywords>0x80000000000000</Keywords> 
    <TimeCreated SystemTime="2016-06-30T07:40:42.499533800Z" /> 
    <EventRecordID>40977</EventRecordID> 
    <Channel>Application</Channel> 
    <Computer>computername.domainname</Computer> 
    <Security /> 
    </System> 
- <EventData> 
    <Data>Application: EndlessP.exe Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: System.NullReferenceException at WindowsFormsApplication2.Form1..ctor() at WindowsFormsApplication2.Program.Main()</Data> 
    </EventData> 
    </Event> 

Es ist gelöst, die Kommentare zu sehen, die Lösung zu sehen. Wenn ich kann, werde ich versuchen, die Erklärung hier hinzuzufügen, warum es passiert ist.

+0

Realisierte einige Formatierungsfehler in der Frage. Sorry, meine zweite Post hier – Zeay

+0

Wissen Sie, wo genau die Ausnahme geworfen wird? –

+0

tue ich nicht, sorry. Momentan liest er Renes Antwort. @ Nitro.de – Zeay

Antwort

4

Form1.ActiveForm wird null in Ihrem Fall sein. Sie müssen das Ereignis für die aktuelle Formular-Instanz festgelegt, die einfach this ist:

this.FormClosing += new FormClosingEventHandler(Form1_Closing); 

Es ist sogar besser, nicht das Ereignis manuell anzubringen, aber die Form der Eigenschaften-Fenster zu verwenden.


Erläuterung: Die Form.ActiveForm Eigenschaft des Formulars Instanz festgelegt ist, die derzeit aktiv ist. Diese Eigenschaft kann in verschiedenen Fällen null sein, zum Beispiel auch wenn Instanzen des Formulars sind, die nicht aktiv sind. Dies ist das Problem in Ihrem Fall. Wenn der Konstruktor ausgeführt wird, gibt es eine Instanz des Formulars, aber es ist noch nicht sichtbar und daher nicht aktiv.

So mit ActiveForm zum Anhängen von Ereignissen kann sogar gefährlich sein! Stellen Sie sich den Fall vor, wenn bereits Instanzen Ihres Formulars vorhanden sind und eines davon sichtbar ist. Jetzt erstellen Sie eine weitere Instanz. Das Ereignis wird an die derzeit aktive Instanz (die eine völlig andere Instanz sein kann) an Stelle der aktuellen Instanz angehängt.

+0

Wow, das macht Sinn, vielen Dank für die Antwort!: D – Zeay

2

Wenn Sie einen Fehler für die NullReference-Ausnahme erhalten, zeigt es an, dass Sie versuchen, auf Felder und Funktionstypen zuzugreifen, die auf null zeigen. Es ist also besser zu überprüfen, ob der Wert, den Sie zuweisen, null ist oder nicht. Beispiel

string myname=null; 
    if (myname.Length == 0) // will generate exception 
    { 
    Console.WriteLine(myname); //it will never get here. 
    } 
Verwandte Themen