Как я могу перехватить нулевые исключения в функции "set" класса?(C #) - PullRequest
0 голосов
/ 13 сентября 2018

Я должен написать программу, которая позволяет пользователю вводить имя, описание и количество страниц книги, и программа должна перехватывать исключения, если имя или описание равно нулю или если число страниц равнониже нуля.Учитель сказал, что нам нужно отлавливать исключения в функции «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 ]

0 голосов
/ 13 сентября 2018

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

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).

0 голосов
/ 13 сентября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...