C#/ .Net错误System.NullreferenceException

时间:2016-06-30 07:46:19

标签: c# .net winforms visual-studio

尝试完成我用C#编写的小窗口应用程序。我构建它没有错误,因为变量“e”从未使用过 当我在构建之后运行程序时没有任何事情发生,并且在事件查看器中我得到.net运行时错误(粘贴在下面)。 代码:

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();
            }
        }

错误XML视图:

- <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>

它已经解决,请查看评论以查看解决方案。如果我可以尝试在此处添加解释原因。

2 个答案:

答案 0 :(得分:4)

在您的情况下,

Form1.ActiveForm将为null。您需要为当前表单实例设置事件,该事件只是this

this.FormClosing += new FormClosingEventHandler(Form1_Closing);

最好不要手动附加事件,而是使用表单的属性窗口。

说明:Form.ActiveForm属性设置为当前活动的表单实例。在各种情况下,此属性可能为null,例如,当表单的实例不是活动时也是如此。这是你的问题。当构造函数执行时,有一个表单实例,但它尚未显示,因此不活动。

因此使用ActiveForm附加事件甚至可能很危险!想象一下,当您的表单已经存在并且其中一个可见时,就会出现这种情况。现在您创建另一个实例。该事件将附加到当前活动的实例(可能是完全不同的实例),而不是当前实例。

答案 1 :(得分:2)

如果您收到NullReference Exception的错误,那么它表示您正在尝试访问指向null的字段,函数类型。因此,最好检查分配的值是否为null。 例如

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