如何在 class 的 "set" 函数中捕获空异常? (C#)
How can I catch null exceptions in "set" function of a class? (c#)
我应该编写一个程序,让用户输入书的名称、描述和页数,如果名称或描述为空,或者如果页数为空,程序应该捕获异常页数低于零。老师说我们需要在class的"set"函数中捕获异常,但是我好像做不对。
这是 class 的样子:
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 方法,我会很高兴听到)。我的问题是,即使输入了名称和描述字符串,空异常仍然会被抛出。任何人都知道我该如何解决?任何帮助将不胜感激。
在 SetDescription
和 SetName
中,您正在检查 field/member 变量而不是 if 语句中的参数。请改为检查参数(在 if 条件下没有 this
)。
你有一个名字冲突。您实际上是在检查私有字段,而不是传递给您的方法的参数。
this.Name
指的是你class的私有字段,不是参数。这就是正确的命名约定很重要的原因。将参数更改为小写以避免混淆,并确保检查 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
值).
我应该编写一个程序,让用户输入书的名称、描述和页数,如果名称或描述为空,或者如果页数为空,程序应该捕获异常页数低于零。老师说我们需要在class的"set"函数中捕获异常,但是我好像做不对。 这是 class 的样子:
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 方法,我会很高兴听到)。我的问题是,即使输入了名称和描述字符串,空异常仍然会被抛出。任何人都知道我该如何解决?任何帮助将不胜感激。
在 SetDescription
和 SetName
中,您正在检查 field/member 变量而不是 if 语句中的参数。请改为检查参数(在 if 条件下没有 this
)。
你有一个名字冲突。您实际上是在检查私有字段,而不是传递给您的方法的参数。
this.Name
指的是你class的私有字段,不是参数。这就是正确的命名约定很重要的原因。将参数更改为小写以避免混淆,并确保检查 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
值).