2013-12-11 112 views
0

我在学习C和C#,这个问题是针对C#的。我看不到在哪里抛出异常。任何帮助非常感谢?代码抛出异常。错误在哪里?

下面是代码:

private static void geraNýjaNámsáætlun() 
    { 
     Console.Write("Hvada nám er þetta?:"); 
     String nám = Console.ReadLine(); 
     Console.Write("Villtu gera vikuáætlun? (y/n):"); 
     string answerYesOrNo = Console.ReadLine(); 
     answerYesOrNo.Trim(); 
     string path = @"C:\nám"; 
     if (answerYesOrNo.ToLower() == "y") 
     { 
      try 
      { 
       Console.Write("Enter the name you want for the filename:"); 
       string some = Console.ReadLine(); 
       string combined = Path.Combine(path, some + ".txt"); 
       if (File.Exists(combined)) 
       { 
        using (TextReader obj2 = new StreamReader(combined)) 
        { 
         if (!obj2.ReadLine().Contains("Mon")) 
         { 
          obj2.Close(); 
          TextWriter obj = File.AppendText(combined); 
          obj.WriteLine("Mon\t\t\t|Thue\t\t\t|Wedn\t\t\t|Thurs\t\t\t|Friday\t\t\t|Sat\t\t\t|Sun\t\t\t"); 
          obj.Close(); 
         } 
        } 
       } 
       using (TextWriter obj = File.AppendText(combined)) 
       { 

         Console.WriteLine("Enginn fyrir monday 3 fyrir thuesday 6 fyrir wednesday 9 fyrir thursday 12 fyrir friday 15 saturday 18 fyrir sunday"); 
         Console.Write("Enter the number of tabs:"); 
         int numberOfTabs = Convert.ToInt32(Console.ReadLine()); 
         Console.Write("Enter the class or lektion:"); 
         string lektionOrClass = Console.ReadLine(); 
         obj.WriteLine(Tabs(numberOfTabs) + "" + lektionOrClass); 
       } 

      } 
      catch (Exception ex) 
      { 
       System.Windows.Forms.MessageBox.Show(ex.Message); 
      } 
     } 

The exception throwing here

现在异常thows这里这条线,我把后,如果检查,以渡过的ReadLine()为null。 ? enter image description here

+0

你调试了你的代码吗? – Monika

+1

尝试和机会'System.Windows.Forms.MessageBox.Show(ex.Message)'到'System.Windows.Forms.MessageBox.Show(ex)' –

+7

我建议你删除try/catch并让visual studio停止在例外。 –

回答

3

这里的问题是,你正在使用obj2.ReadLine()两次。

if (obj2.ReadLine() != null) 
{ 
    if (obj2.ReadLine().Contains("Mon")) 

这将尝试从文件读取线。但是,如果第一次读取流/文件的最后一行,另一个调用ReadLine将返回null,这是您的例外,当您尝试在空引用上调用.Contains("Mon")时。

基本上每个一次调用obj2.ReadLine(),它将从文件返回下一个线,或null如果没有更多的线路。重复调用该方法将不会返回相同的行。要重用从文件中读取的单行/第一行,您需要将第一次调用的结果存储在变量中,并使用该变量而不是再次调用该方法。

如果你真的想在这里消耗从流两行,至少检查线路实际上是阅读:

if (obj2.ReadLine() != null) 
{ 
    string line = obj2.ReadLine(); 
    if (line != null && line.Contains("Mon")) 

如果你不想占用两行,更改代码以这种:

string line = obj2.ReadLine(); 
if (line != null && line.Contains("Mon")) 
{ 
    ... 
4

我不能立即告诉你问题出在哪里,但我可以告诉你如何找出答案。

首先,删除此catch块(乃至try条款):

catch (Exception ex) 
{ 
    System.Windows.Forms.MessageBox.Show(ex.Message); 
} 

也就是说你隐藏有价值的信息 - 尤其是堆栈跟踪。两点很重要:

  • 你应该平时只赶上你相信例外您可以真正手柄,例如IOException由于IO故障,这也许你可以重试。 NullReferenceException始终是由于错误(通常在您自己的代码中)导致的,您不应该尝试处理该问题,而不是针对只需要继续工作的服务的非常高级别的问题。
  • 每当你登录一个异常,不要只是登录消息。记录整个事情,包括堆栈跟踪和任何嵌套异常。否则,你会失去大量有用的数据,这些数据会用来解决问题。

一旦你停止捕捉异常并丢弃有用的信息,你会看到NullReferenceException被抛出的位置。在这一点上,你应该能够计算出你试图取消引用的空引用,并适当地更改代码。

如果突出显示一行,并且无法确定哪个引用可能为空,那通常是一种症状,应该将复杂的代码行重构为几个更简单的代码。

事实上,问题可能是因为您正在从空文件读取。在这种情况下,obj2.ReadLine()将返回一个空值(表示文件结尾),并且当您尝试使用您的Contains调用取消引用时,它将引发此异常。然而,了解问题以及如何诊断问题比解决直接原因更重要。

+1

如果可以的话,Jon个人问题。你每周睡几个小时? – Alex

+3

@Alex:曾经有过关于这种事情的元问题。一周内每晚约6.5小时;周末每晚7.5小时。 –

+0

你可能会得到很多,但我会说无论如何。你给的任何答案都是令人高兴的阅读。即使是在“微不足道”的问题。 – Alex

0

如果正在分配空值/对象的对象未分配的对象正被分配给新创建的对象,则会发生此错误。 请使用断点进行调试。

+0

对于术语来说,你的回答是无益的 - 一个* object *永远为空,并且一个对象不会被赋值... *一个*变量*可能被赋予一个空引用,这很好 - 当你试图去引用时*没有问题。 –

0

也许“obj2.ReadLine()。Contains”会导致此错误,您可以更好地看到它在“调试”模式下运行项目。

0

当我检查string path = @"C:\nám";路径是否存在于C盘上时,请检查此路径是否存在。

0

您正在使用您检查其存在位置以外的文件;移动它的块中,像这样:

private static void geraNýjaNámsáætlun() 
{ 
    Console.Write("Hvada nám er þetta?:"); 
    String nám = Console.ReadLine(); 
    Console.Write("Villtu gera vikuáætlun? (y/n):"); 
    string answerYesOrNo = Console.ReadLine(); 
    answerYesOrNo.Trim(); 
    string path = @"C:\nám"; 
    if (answerYesOrNo.ToLower() == "y") 
    { 
     try 
     { 
      Console.Write("Enter the name you want for the filename:"); 
      string some = Console.ReadLine(); 
      string combined = Path.Combine(path, some + ".txt"); 
      if (File.Exists(combined)) 
      { 
       using (TextReader obj2 = new StreamReader(combined)) 
       { 
        if (!obj2.ReadLine().Contains("Mon")) 
        { 
         obj2.Close(); 
         TextWriter obj = File.AppendText(combined); 
         obj.WriteLine("Mon\t\t\t|Thue\t\t\t|Wedn\t\t\t|Thurs\t\t\t|Friday\t\t\t|Sat\t\t\t|Sun\t\t\t"); 
         obj.Close(); 
        } 
       } 
       using (TextWriter obj = File.AppendText(combined)) 
       { 

         Console.WriteLine("Enginn fyrir monday 3 fyrir thuesday 6 fyrir wednesday 9 fyrir thursday 12 fyrir friday 15 saturday 18 fyrir sunday"); 
         Console.Write("Enter the number of tabs:"); 
         int numberOfTabs = Convert.ToInt32(Console.ReadLine()); 
         Console.Write("Enter the class or lektion:"); 
         string lektionOrClass = Console.ReadLine(); 
         obj.WriteLine(Tabs(numberOfTabs) + "" + lektionOrClass); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      System.Windows.Forms.MessageBox.Show(ex.Message); 
     } 
    } 
}