我应该写一个程序,让用户输入书的名称,描述和页数,如果名称或描述为null或页数为,该程序应捕获异常。低于零。老师说,我们需要在课堂的“设置”功能中捕获异常,但我似乎无法正确理解。 这是该类的样子:
class Book
{
private string Name;
private string Description;
private int Pages;
public string GetName()
{
return Name;
}
public string GetDescription()
{
return Description;
}
public int GetPages()
{
return Pages;
}
public void SetName(string Name)
{
if (this.Name == null)
throw new Exception("The name can't be blank");
else
this.Name = Name;
}
public void SetDescription(string Description)
{
if (this.Description == null)
throw new Exception("The description can't be blank");
else
this.Description = Description;
}
public void SetPages(int Pages)
{
if(Pages > 0)
{
this.Pages = Pages;
}
else
{
Console.WriteLine("Number of pages has to be higher than zero");
}
}
public void Write()
{
Console.WriteLine("Name: {0}, Description: {1}, Pages: {2}", Name, Description, Pages);
}
}
主要外观如下:
Book hp = new Book();
hp.SetName("Harry Potter");
hp.SetDescription("It's okay");
hp.SetPages(-500);
hp.Write();
我知道SetPages并没有真正使用catch方法,但是我认为它仍然可以工作(尽管如果有人对如何使用catch方法有个想法,我会很高兴听到)。我的问题是,即使在名称和描述字符串明确输入的情况下,仍然会引发null异常。有人知道我该如何解决吗?任何帮助将不胜感激。
答案 0 :(得分:4)
在SetDescription
和SetName
中,您正在检查字段/成员变量,而不是if语句中的参数。请改为检查参数(if条件为否this
。
答案 1 :(得分:1)
您有名字冲突。您实际上是在检查私有字段,而不是传递给方法的参数。
this.Name
引用类的私有字段,而不是参数。这就是为什么适当的命名约定很重要的原因。将该参数更改为小写字母以避免混淆,并确保检查null
的值:
public void SetName(string name)
{
if (name == null)
throw new Exception("The name can't be blank");
else
this.Name = name;
}
您可能还需要考虑使用静态String
函数IsNullOrWhiteSpace:
if (String.IsNullOrWhiteSpace(name))
throw new Exception("The name can't be blank");
私有字段周围也有约定,因此您可能也想更改该字段的名称。例如,命名私有字段的常见方法是:
private string _name;
您的try / catch块始终被触发,因为您始终在检查私有字段null
。纠正了该字段的问题后,将对该参数进行检查,将正确设置该字段,并且try / catch块不应执行(除非您传入null
值)。