Как я могу поймать нулевые исключения в "установленной" функции класса? (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, я буду счастлив услышать). Моя проблема в том, что даже когда строки имени и описания явно имеют ввод, нулевое исключение все равно генерируется. Кто-нибудь знает, как я могу это исправить? Любая помощь будет оценена по достоинству.

0
0
44
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В SetDescription и SetName вы проверяете переменную поля / члена вместо параметра в операторах if. Вместо этого проверьте параметр (нет this в условии if).

Ответ принят как подходящий

У вас конфликт имен. Фактически вы проверяете частное поле, а не параметр, который передается вашему методу.

this.Name относится к частному полю вашего класса, а не к параметру. Вот почему важны правильные соглашения об именах. Измените значение параметра на нижний регистр, чтобы избежать путаницы, и убедитесь, что вы проверили это значение для null:

public void SetName(string name)
{
    if (name == null)
        throw new Exception("The name can't be blank");
    else
        this.Name = name;
}

Вы также можете рассмотреть возможность использования статической функции StringIsNullOrWhiteSpace:

if (String.IsNullOrWhiteSpace(name))
    throw new Exception("The name can't be blank");

Существуют также соглашения о частных полях, поэтому вы можете также изменить имя этого поля. Например, общий способ именования частных полей:

private string _name;

Ваш блок try / catch всегда запускается, потому что вы всегда проверяете частное поле, которое является null. Как только вы исправите проблему с полем, будет произведена проверка по параметру, поле будет установлено правильно, и блок try / catch не должен выполняться (если, конечно, вы не передадите значение null).

Спасибо за вашу помощь, функция IsNullOrWhiteSpace и ваше объяснение мне действительно помогли ^^

Tony Slepian 13.09.2018 20:22

Рад помочь, @TonySlepian. Не забудьте принять ответ ... :-)

JuanR 13.09.2018 20:51

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