我正在学习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);
}
}
现在异常在这一行上显示,在我检查天气后,ReadLine()为空。吗
答案 0 :(得分:4)
我无法立即告诉你问题出在哪里,但我可以告诉你如何找到答案。
首先,删除此catch块(实际上是try
子句):
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
这是隐藏有价值的信息 - 特别是堆栈跟踪。两个要点:
IOException
,您可以重试。 NullReferenceException
总是由于错误(通常在您自己的代码中),您不应该尝试处理除了可能需要继续的服务的非常高级别之外的其他错误工作一旦您停止捕获异常并丢弃有用信息,您将看到NullReferenceException
被抛出的位置。此时,您应该能够计算出您尝试取消引用的空引用,并适当地更改代码。
如果突出显示单行,并且您无法确定哪个引用可能为null,那么这通常是一种症状,您应该将一行复杂的代码重构为几个更简单的代码。
事实上,问题可能是因为你正在读取一个空文件。在这种情况下,obj2.ReadLine()
将返回一个空值(表示文件的结尾),当您尝试使用Contains
调用取消引用时,它将抛出此异常。但是,了解问题以及如何诊断它比解决直接原因更重要。
答案 1 :(得分:3)
这里的问题是您使用obj2.ReadLine()
两次。
if (obj2.ReadLine() != null)
{
if (obj2.ReadLine().Contains("Mon"))
这将尝试从文件中读取两个行。但是,如果第一次读取读取流/文件的最后一行,则对ReadLine
的另一次调用将返回null
,当您尝试在.Contains("Mon")
上调用obj2.ReadLine()
时,这是您的例外情况。空参考。
基本上,每次时间调用null
,它会从文件中返回 next 行,如果没有更新,则返回if (obj2.ReadLine() != null)
{
string line = obj2.ReadLine();
if (line != null && line.Contains("Mon"))
线。对该方法的重复调用不会返回相同的行。要重用从文件中读取的单行/第一行,需要将第一次调用的结果存储在变量中,并使用变量而不是再次调用该方法。
如果你真的想在这里使用流中的两行,至少检查一行是否实际读过:
string line = obj2.ReadLine();
if (line != null && line.Contains("Mon"))
{
...
如果您不想使用两行,请将代码更改为:
{{1}}
答案 2 :(得分:0)
如果正在为未分配的Null值/对象分配的对象被分配给新创建的对象,则会发生此错误。 请使用断点进行调试。
答案 3 :(得分:0)
也许是“obj2.ReadLine()。包含”导致此错误,您可以看到它更好地以“调试”模式运行您的项目。
答案 4 :(得分:0)
当我检查C驱动器上存在string path = @"C:\nám";
路径时,检查此路径是否存在。
答案 5 :(得分: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);
}
}
}