Как я могу поймать нулевые исключения в функции "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 если условие).

Другие вопросы по тегам