触发事件时出现 NullReferenceException

发布于 2024-10-11 16:29:58 字数 6074 浏览 4 评论 0原文

问题是:我收到 NullReferenceException 但我似乎无法找出原因。 (我刚从 C# 开始)并阅读了 Microsoft 的 C# for kids。它解释了很多,但这我不明白。

但我没有得到将异常抛出到我脑海中的代码片段。

代码是:

using System;  
using System.Collections.Generic;  
using System.Linq; using System.Text;  
using System.IO.Ports;  
using PlugwiseLib.BLL.BC;  
using plugwiseLib.BLL.BPC;  
using System.Text.RegularExpressions;  

using System.Threading;  
using System.IO;  
using PlugwiseLib.BLL.BPC;
using PlugwiseLib.UTIL;  
 namespace PlugwiseLib {  
       public class plugwiseControl  
     {  
         private SerialPort port;  
         private PlugwiseActions currentAction;  
         public delegate void PlugwiseDataReceivedEvent(object
 sender, System.EventArgs e,
 List<PlugwiseMessage> data);  
         public event PlugwiseDataReceivedEvent
 DataReceived;  

    private PlugwiseReader reader;

    /// <summary>
    /// Constructor for the Plugwise Control class
    /// </summary>
    /// <param name="serialPort">The serial port name that the plugwise stick takes</param>
    public plugwiseControl(string serialPort)
    {
        try
        {
            port = new SerialPort(serialPort);
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

            port.BaudRate = 115200;
            currentAction = PlugwiseActions.None;
            reader = new PlugwiseReader();
        }
        catch (Exception e)
        {
            throw new Exception("Could not connect to plug.");
        }
    }

    /// <summary>
    /// This is the method that sends a command to the plugwise plugs.
    /// </summary>
    /// <param name="mac">The mac adress of the plug that needs to perform the action</param>
    /// <param name="action">The action that has to be performed</param>
    public void Action(string mac,PlugwiseActions action)
    {
        try
        {

            string message = "";
            switch (action)
            {
                case PlugwiseActions.On:
                    currentAction = PlugwiseActions.On;
                    message = PlugwiseSerialPortFactory.Create(PlugwiseSerialPortRequest.on,mac);


                    break;
                case PlugwiseActions.Off:
                    currentAction = PlugwiseActions.Off;
                    message = PlugwiseSerialPortFactory.Create(PlugwiseSerialPortRequest.off, mac);


                    break;
                case PlugwiseActions.Status:

                    currentAction = PlugwiseActions.Status;
                    message = PlugwiseSerialPortFactory.Create(PlugwiseSerialPortRequest.status, mac);

                    break;
                case PlugwiseActions.Calibration:
                    currentAction = PlugwiseActions.Calibration;
                    message = PlugwiseSerialPortFactory.Create(PlugwiseSerialPortRequest.calibration, mac);


                    break;
                case PlugwiseActions.powerinfo:
                    currentAction = PlugwiseActions.powerinfo;
                    message = PlugwiseSerialPortFactory.Create(PlugwiseSerialPortRequest.powerinfo,mac);

                    break;
                case PlugwiseActions.history:
                    message = "";
                    break;
            }
            if (message.Length > 0)
            {
                port.WriteLine(message);
                Thread.Sleep(10);
            }

        }
        catch (Exception e)
        {

            throw e;
        }
    }
    /// <summary>
    /// This is the method that sends a command to the plugwise plugs that retrieves the history power information
    /// </summary>
    /// <param name="mac">The mac adress of the plug that needs to perform the action</param>
    /// <param name="logId">The id of the history message that has to be retrieved</param>
    /// <param name="action">The action that has to be performed this MUST be history</param>
    public void Action(string mac,int logId,PlugwiseActions action)
    {
        string message = "";
        switch(action)
        {
            case PlugwiseActions.history:
             currentAction = PlugwiseActions.history;
             message = PlugwiseSerialPortFactory.Create(PlugwiseSerialPortRequest.history, MessageHelper.ConvertIntToPlugwiseLogHex(logId), mac);
         break;
        }

        if (message.Length > 0)
        {
            port.WriteLine(message);
            Thread.Sleep(10);
        }
    }

    private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {// Event for receiving data

        string txt = port.ReadExisting();
        List<PlugwiseMessage> msg = reader.Read(Regex.Split(txt, "\r\n"));
        DataReceived(sender, new System.EventArgs(), msg);


    }

    /// <summary>
    /// This method Opens the connection to the serial port
    /// </summary>
    public void Open()
    {
        try
        {
            if (!port.IsOpen)
            {
                port.Open();
            }
        }
        catch (System.IO.IOException ex)
        {
            throw ex;
        }
    }

    /// <summary>
    /// This method closes the connection to the serial port
    /// </summary>
    public void Close()
    {
        try
        {
            if (port.IsOpen)
            {
                port.Close();
            }
            Thread.Sleep(5);
        }
        catch (IOException ex)
        {
            throw ex;
        }
    }
  }
}

我在这篇文章中遇到异常(在 Visual C# 2008 Express 中)

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{// Event for receiving data

    string txt = port.ReadExisting();
    List<PlugwiseMessage> msg = reader.Read(Regex.Split(txt, "\r\n"));
    DataReceived(sender, new System.EventArgs(), msg);

alt text

我检查了 'msg' 但这充满了到目前为止我可以看到的有效数据。 所以我不知道为什么我会得到例外。

The problem is: I get a NullReferenceException but I can't seem to find out why. (I just start with C#) and have read the C# for kids from Microsoft. It explained a lot but this I do not understand.

But I don't get the piece of code which throw the exception to my head.

Code is:

using System;  
using System.Collections.Generic;  
using System.Linq; using System.Text;  
using System.IO.Ports;  
using PlugwiseLib.BLL.BC;  
using plugwiseLib.BLL.BPC;  
using System.Text.RegularExpressions;  

using System.Threading;  
using System.IO;  
using PlugwiseLib.BLL.BPC;
using PlugwiseLib.UTIL;  
 namespace PlugwiseLib {  
       public class plugwiseControl  
     {  
         private SerialPort port;  
         private PlugwiseActions currentAction;  
         public delegate void PlugwiseDataReceivedEvent(object
 sender, System.EventArgs e,
 List<PlugwiseMessage> data);  
         public event PlugwiseDataReceivedEvent
 DataReceived;  

    private PlugwiseReader reader;

    /// <summary>
    /// Constructor for the Plugwise Control class
    /// </summary>
    /// <param name="serialPort">The serial port name that the plugwise stick takes</param>
    public plugwiseControl(string serialPort)
    {
        try
        {
            port = new SerialPort(serialPort);
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

            port.BaudRate = 115200;
            currentAction = PlugwiseActions.None;
            reader = new PlugwiseReader();
        }
        catch (Exception e)
        {
            throw new Exception("Could not connect to plug.");
        }
    }

    /// <summary>
    /// This is the method that sends a command to the plugwise plugs.
    /// </summary>
    /// <param name="mac">The mac adress of the plug that needs to perform the action</param>
    /// <param name="action">The action that has to be performed</param>
    public void Action(string mac,PlugwiseActions action)
    {
        try
        {

            string message = "";
            switch (action)
            {
                case PlugwiseActions.On:
                    currentAction = PlugwiseActions.On;
                    message = PlugwiseSerialPortFactory.Create(PlugwiseSerialPortRequest.on,mac);


                    break;
                case PlugwiseActions.Off:
                    currentAction = PlugwiseActions.Off;
                    message = PlugwiseSerialPortFactory.Create(PlugwiseSerialPortRequest.off, mac);


                    break;
                case PlugwiseActions.Status:

                    currentAction = PlugwiseActions.Status;
                    message = PlugwiseSerialPortFactory.Create(PlugwiseSerialPortRequest.status, mac);

                    break;
                case PlugwiseActions.Calibration:
                    currentAction = PlugwiseActions.Calibration;
                    message = PlugwiseSerialPortFactory.Create(PlugwiseSerialPortRequest.calibration, mac);


                    break;
                case PlugwiseActions.powerinfo:
                    currentAction = PlugwiseActions.powerinfo;
                    message = PlugwiseSerialPortFactory.Create(PlugwiseSerialPortRequest.powerinfo,mac);

                    break;
                case PlugwiseActions.history:
                    message = "";
                    break;
            }
            if (message.Length > 0)
            {
                port.WriteLine(message);
                Thread.Sleep(10);
            }

        }
        catch (Exception e)
        {

            throw e;
        }
    }
    /// <summary>
    /// This is the method that sends a command to the plugwise plugs that retrieves the history power information
    /// </summary>
    /// <param name="mac">The mac adress of the plug that needs to perform the action</param>
    /// <param name="logId">The id of the history message that has to be retrieved</param>
    /// <param name="action">The action that has to be performed this MUST be history</param>
    public void Action(string mac,int logId,PlugwiseActions action)
    {
        string message = "";
        switch(action)
        {
            case PlugwiseActions.history:
             currentAction = PlugwiseActions.history;
             message = PlugwiseSerialPortFactory.Create(PlugwiseSerialPortRequest.history, MessageHelper.ConvertIntToPlugwiseLogHex(logId), mac);
         break;
        }

        if (message.Length > 0)
        {
            port.WriteLine(message);
            Thread.Sleep(10);
        }
    }

    private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {// Event for receiving data

        string txt = port.ReadExisting();
        List<PlugwiseMessage> msg = reader.Read(Regex.Split(txt, "\r\n"));
        DataReceived(sender, new System.EventArgs(), msg);


    }

    /// <summary>
    /// This method Opens the connection to the serial port
    /// </summary>
    public void Open()
    {
        try
        {
            if (!port.IsOpen)
            {
                port.Open();
            }
        }
        catch (System.IO.IOException ex)
        {
            throw ex;
        }
    }

    /// <summary>
    /// This method closes the connection to the serial port
    /// </summary>
    public void Close()
    {
        try
        {
            if (port.IsOpen)
            {
                port.Close();
            }
            Thread.Sleep(5);
        }
        catch (IOException ex)
        {
            throw ex;
        }
    }
  }
}

I get the exception at this piece (in Visual C# 2008 express)

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{// Event for receiving data

    string txt = port.ReadExisting();
    List<PlugwiseMessage> msg = reader.Read(Regex.Split(txt, "\r\n"));
    DataReceived(sender, new System.EventArgs(), msg);

alt text

I checked 'msg' but this is filled with so far i can see valid data.
So I don't know why I get the exception.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

踏月而来 2024-10-18 16:29:58

您有 plugwiseControl.DataReceived 事件的订阅者吗?引发事件的常见方法是

var handler = DataReceived;
if(handler != null) handler(sender, EventArgs.Empty, msg);

Do you have any subscribers for plugwiseControl.DataReceived event? A common way to raise event is

var handler = DataReceived;
if(handler != null) handler(sender, EventArgs.Empty, msg);
格子衫的從容 2024-10-18 16:29:58

我认为 DataReceived 事件未通过调用方法初始化。

I think DataReceived event is not initialized, by the calling method.

放血 2024-10-18 16:29:58

在 .NET 中,如果您引发一个事件,并且没有为该事件注册侦听器(您的事件没有执行任何操作,就像您在构造函数中的 try {} 块的第二行中对端口的 DataReceived 事件所做的那样),它会显示为 null,并引发该异常。在您的观察列表屏幕截图中,DataReceived 为空,这让我认为这就是问题所在。所以:

if (DataReceived != null)
  DataReceived(...arguments here...);

In .NET, if you raise an event and there are no registered listeners for that event (nothing has done to your event what you do to your port's DataReceived event in the second line of your try {} block in your constructor), it shows up as null, and raises that exception. In your Watch list screenshot, DataReceived is null, which makes me think this is the problem. So:

if (DataReceived != null)
  DataReceived(...arguments here...);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文