Как я могу поймать нулевые исключения в функции "set" класса? (C#)
Я должен написать программу, которая позволяет пользователю вводить имя, описание и количество страниц книги, и программа должна перехватывать исключения, если имя или описание являются нулевыми, или если количество страниц меньше нуля, Учитель сказал, что нам нужно отлавливать исключения в функции "set" класса, но я не могу понять, что это правильно. Вот как выглядит класс:
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 все равно генерируется. Кто-нибудь знает, как я могу это исправить? Любая помощь будет оценена.
2 ответа
У вас есть столкновение имен. Вы на самом деле проверяете приватное поле, а не параметр, который передается вашему методу.
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
значение).
В SetDescription
а также SetName
вы проверяете переменную field/member вместо параметра в ваших операторах if. Вместо этого проверьте параметр (нет this
если условие).