【问题标题】:Object reference not set to an instance of an object with OxyPlot对象引用未设置为具有 OxyPlot 的对象的实例
【发布时间】:2019-07-09 06:35:57
【问题描述】:

我正在打开一个带有系列和日期的对象。我可以使用所有系列,但在最后一行“_measurement.MeasurementInfo.StartDateAndTime = seriesObject.Date;”我收到一条错误消息,提示“对象引用未设置为对象的实例”。我在互联网上查看,有些人说该对象将为空 - 但该对象不为空。对象是 seriesObject = {BSIAnalyzer.SeriesObject}。有人可以帮我解决这个问题吗?

    private void openAnalysis()
    {
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = "BSI analyses | *.anl";
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            SeriesObject seriesObject = null;
            try
            {
                FileManager fileManager = new FileManager();
                seriesObject = fileManager.Load<SeriesObject>(ofd.FileName);
            }
            catch (Exception e)
            {
                throw e;
            }
            // TODO same loop for scatter
            if (seriesObject.LineSeries != null)
            {
                foreach (LineSeriesObject lineSeriesObject in seriesObject.LineSeries)
                {
                    if (lineSeriesObject.Name == "_sBSIV1SeriesA")
                    {
                        if (lineSeriesObject.DataPoints != null)
                        {
                            foreach (LineSeriesObjectDataPoint dataPoint in lineSeriesObject.DataPoints)
                            {
                                _sBSIV1SeriesA.Points.Add(new DataPoint(dataPoint.X, dataPoint.Y));
                            }
                        }
                        this.plotBSITotalA.Model.Series.Add(_sBSIV1SeriesA);
                    }
                    **For all series in object**
                    refreshPlots(true);
                }
            }
            if (seriesObject.ScatterSeries != null)
            {
                foreach (ScatterSeriesObject scatterSeriesObject in seriesObject.ScatterSeries)
                {
                    if (scatterSeriesObject.Name == "_sBSIV1ArtifactSeriesA")
                    {
                        if (scatterSeriesObject.DataPoints != null)
                        {
                            foreach (ScatterSeriesObjectDataPoint dataPoint in scatterSeriesObject.DataPoints)
                            {
                                _sBSIV1ArtifactSeriesA.Points.Add(new DataPoint(dataPoint.X, dataPoint.Y));
                            }
                        }
                        this.plotBSITotalA.Model.Series.Add(_sBSIV1ArtifactSeriesA);
                    }
                    **For all series in object** 
                }
            }
            refreshPlots(true);   

            _measurement.MeasurementInfo.StartDateAndTime = seriesObject.Date;           
        }
    }

来自对象的类是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;


namespace BSIAnalyzer
{ 
[Serializable]
public class LineSeriesObjectDataPoint
{
    public Double X { get; set; }
    public Double Y { get; set; }
    public LineSeriesObjectDataPoint(Double x, Double y)
    {
        this.X = x;
        this.Y = y;
    }
}
[Serializable]
public class LineSeriesObject
{
    public Int32 Id { get; set; }
    public String Name { get; set; }
    public List<LineSeriesObjectDataPoint> DataPoints { get; set; }

    public LineSeriesObject()
    {
        this.InitMembers();
    }

    private void InitMembers()
    {
        this.DataPoints = new List<LineSeriesObjectDataPoint>();
    }
}
[Serializable]
public class ScatterSeriesObjectDataPoint
{
    public Double X { get; set; }
    public Double Y { get; set; }

    public ScatterSeriesObjectDataPoint(Double x, Double y)
    {
        this.X = x;
        this.Y = y;
    }
}
[Serializable]
public class ScatterSeriesObject
{
    public Int32 Id { get; set; }
    public String Name { get; set; }
    public List<ScatterSeriesObjectDataPoint> DataPoints { get; set; }

    public ScatterSeriesObject()
    {
        this.InitMembers();
    }

    public void InitMembers()
    {
        this.DataPoints = new List<ScatterSeriesObjectDataPoint>();
    }
}
[Serializable]
class SeriesObject
{
    public String Date { get; set; }
    public List<LineSeriesObject> LineSeries { get; set; }
    public List<ScatterSeriesObject> ScatterSeries { get; set; }
    public SeriesObject()
    {
        this.InitMembers();
    }
    private void InitMembers()
    {
        this.LineSeries = new List<LineSeriesObject>();
        this.ScatterSeries = new List<ScatterSeriesObject>();
    }
}
class FileManager
{
    public FileManager()
    {
        this.InitMembers();
    }
    private void InitMembers()
    {
    }
    public T Load<T>(String path)
    {
        try
        {
            FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            T myLoadedObject = (T)binaryFormatter.Deserialize(fileStream);
            fileStream.Close();
            return myLoadedObject;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

}

【问题讨论】:

  • 尝试调试?检查对象值是否真的为空,说它被设置为某个值并不意味着它不会为空。
  • 最好使用调试器而不是静态分析来解决这些问题。
  • 有些人告诉你发生了什么。它是空的。
  • 哇,反应真快。已经调试过了。这就是为什么我发现对象是:seriesObject = {BSIAnalyzer.SeriesObject}。 @D Stanley:_measurement 似乎为空。但是还是不知道怎么解决

标签: c# nullreferenceexception oxyplot


【解决方案1】:

如果在这一行抛出异常:

_measurement.MeasurementInfo.StartDateAndTime = seriesObject.Date;

那么以下一项为空:

seriesObject 
_measurement
_measurement.MeasurementInfo

如果没有看到_measurementMeasurementInfo 的初始化,为什么仅仅通过查看代码就不可能知道其中一个为空。

【讨论】:

  • 谢谢。似乎 _measurement = new BrainRTMeasurement(fileName, _isOnlineContext);正站在方法外。我觉得自己像个菜鸟。感谢您的反应:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多