2014-02-18 228 views
0

我有一个代码允许用户选择文件并将数据分配到数组中。c#原始错误:对象引用未设置为对象的实例错误

private void Load_data_Click(object sender, EventArgs e) 
    { 
     Stream myStream = null; 
     OpenFileDialog openFileDialog1 = new OpenFileDialog(); 

     openFileDialog1.InitialDirectory = "C:\\DataArray"; 
     openFileDialog1.Filter = "txt files (*.txt)|*.txt"; 
     openFileDialog1.FilterIndex = 2; 
     openFileDialog1.RestoreDirectory = true; 

     if (openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      try 
      { 
       if ((myStream = openFileDialog1.OpenFile()) != null) 
       { 
        using (myStream) 
        { 
         string filename = openFileDialog1.FileName; 
         var lineCount = 0; 
         using (var reader = File.OpenText(@filename)) 
         { 
          while (reader.ReadLine() != null) 
          { 
           lineCount++; 
          } 
          for(var count = 0; count < lineCount; ++count) 
          { 
           var data = reader.ReadLine().Split(','); 
           GlobalDataClass.dDataArray[count, 0] = double.Parse(data[0]); 
           GlobalDataClass.dDataArray[count, 1] = double.Parse(data[1]); 
          } 
          ShowGraphData(lineCount); 
         } 

        } 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); 
      } 
     } 
    } 

一旦赋值,我调用函数showgraphdata绘制zedgraph。

public void ShowGraphData(long lTotalData) 
    { 
     double[] dx = new double[lTotalData]; 
     double[] dy = new double[lTotalData]; 

     for (long li = 0; li < lTotalData; li++) 
     { 
      dx[li] = GlobalDataClass.dDataArray[li, 0]; 
      dy[li] = GlobalDataClass.dDataArray[li, 1]; 

     } 
     zedGraphControlStickiness.GraphPane.CurveList.Clear(); 
     GraphPane StickinessPane = zedGraphControlStickiness.GraphPane; 

      // PointPairList holds the data for plotting, X and Y arrays 
      PointPairList spl1 = new PointPairList(dx, dy); 

      // Add cruves to myPane object 
      LineItem ProductionCurve = StickinessPane.AddCurve("Insertion Force", spl1, Color.Blue, SymbolType.None); 
      ProductionCurve.Line.Width = 2.0F; 

     zedGraphControlStickiness.AxisChange(); 
     zedGraphControlStickiness.Invalidate(); 
     zedGraphControlStickiness.Refresh(); 
     GlobalDataClass.iTotalReadingPoint = lTotalData; 

    } 

但是当我执行这个代码,我得到这个错误:“对象引用不设置到对象的实例”

有人可以告诉我哪来我的错误TQ

+0

什么行引发异常? –

+0

不知道在哪一行,因为我可以执行此代码,唯一的情况是当我点击加载数据时它提示错误。 – Ren

+0

你使用Visual Studio吗? –

回答

1

问题? :您正在尝试拨打ReadLine()方法两次。 当您正在阅读直到文件结束时,您的流将变为nullwhile()循环末尾。

while (reader.ReadLine() != null) //<-- reading 1st time 
{ 
lineCount++; 
} //stream becomes null here 
for(var count = 0; count < lineCount; ++count) 
{ 
var data = reader.ReadLine().Split(','); //<-- reading 2nd time 
GlobalDataClass.dDataArray[count, 0] = double.Parse(data[0]); 
GlobalDataClass.dDataArray[count, 1] = double.Parse(data[1]); 
} 

解决方案:您可以使用File.ReadLines()方法来读取一个文件中的所有行。

试试这个:

string filename = openFileDialog1.FileName; 
var lineCount = 0; 
using (var reader in File.ReadLines(@filename)) 
{  
    var data=reader.Split(','); 
    lineCount ++; 
    GlobalDataClass.dDataArray[count, 0] = double.Parse(data[0]); 
    GlobalDataClass.dDataArray[count, 1] = double.Parse(data[1]); 
} 
ShowGraphData(lineCount); 
+0

哇..我永远不会知道这一点,我是一个很棒的人。 – Ren

+0

@Ren:你是欢迎:)很高兴帮助你。 –

2

的问题是,你正在阅读,直到你到达然后结束:

while (reader.ReadLine() != null) 
    { 
     lineCount++; 
    } 

那么你正在阅读更多,这将总是抛出一个空引用异常(如每次调用readline将返回null。

for(var count = 0; count < lineCount; ++count) 
    { 
     var data = reader.ReadLine().Split(','); 
     GlobalDataClass.dDataArray[count, 0] = double.Parse(data[0]); 
     GlobalDataClass.dDataArray[count, 1] = double.Parse(data[1]); 
    } 

将您的代码段合并为一次读取要解决这个问题:

string line; 
    while ((line = reader.ReadLine()) != null) 
    { 
     var data = line.Split(','); 

     GlobalDataClass.dDataArray[lineCount, 0] = double.Parse(data[0]); 
     GlobalDataClass.dDataArray[lineCount, 1] = double.Parse(data[1]); 

     lineCount++; 
    } 
+0

真棒..感谢您的意见! – Ren

0

当你遍历(reader.ReadLine()!= NULL)要更改的位置到EOF。 请尝试像这样的

if (openFileDialog1.ShowDialog() == DialogResult.OK) 
    { 
     try 
     { 
      var count = 0; 
      using (var reader = File.OpenText(@openFileDialog1.FileName)) 
      { 
       var str = reader.ReadLine(); 

       while (str != null) 
       { 
        var data = str.Split(','); 
        GlobalDataClass.dDataArray[count, 0] = double.Parse(data[0]); 
        GlobalDataClass.dDataArray[count, 1] = double.Parse(data[1]); 
        str = reader.ReadLine(); 
        count++; 
       } 
      } 

      ShowGraphData(count - 1); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); 
     } 
    } 
相关问题