Как я должен обрабатывать исключения, выброшенные из конструктора - PullRequest
0 голосов
/ 03 мая 2020

Я столкнулся с этой проблемой:

Я делаю объект, скажем, Персона;

public class Person
{
    public Person(String name, int age)
    {
        if (age < 0)
        {
            throw new AgeException("Age can not be lesser than 0");
        }
    }
}

Каждая инициализация объекта означает, что мне придется иметь дело с блок try-catch. Мне кажется, что-то не так, как:

public static main(String[] args)
{
    try
    {
        Person p = new Person("SwagiWagi", 18);
    }
    catch (AgeException ex)
    {
        int age = -18;

        if (age < 0)
        {
            age = 18;
        }

        try
        {
            Person p = new Person("SwagiWagi", 18);
        }
        catch (AgeException ex)
        {
           System.out.println("This does not look right.");
        }
    }
}

Это не правильно, это грязный и неясный код.

Что мне делать?

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

В какой-то момент вы должны спросить себя: в какой момент программа ДОЛЖНА создавать sh, а не пытаться решить проблемы? Иногда лучше, если программа завершает работу, потому что она не может правильно работать, если критический параметр имеет недопустимое значение.

Вы можете просто объявить, что метод main вызывает исключение AgeException, но программа все равно sh, потому что любое необработанное исключение завершает программу. Если вы хотите убедиться, что программа продолжает работать, вы должны обработать все объявленные исключения.

Кроме того, то, что вы здесь делаете, кажется мне очень неправильным:

public static main(String[] args)
{
    try
    {
        Person p = new Person("SwagiWagi", 18);
    }
    catch (AgeException ex)
    {
        int age = -18;

        if (age < 0)
        {
            age = 18;
        }

        try
        {
            Person p = new Person("SwagiWagi", 18);
        }
        catch (AgeException ex)
        {
           System.out.println("This does not look right.");
        }
    }
}

При первой попытке блок, который вы хотите поймать неверный ввод от пользователя или любой другой параметр, который дает параметр для объекта Person. И в блоке catch вы пытаетесь «исправить» эти входные данные и проверить это с помощью ДРУГОГО блока try-catch для ТОГО ЖЕ исключительного случая.

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

Если есть способ просто исправить проблему, например, попросить пользователя снова ввести правильное значение, вы должны Конечно, делать это, но это может быть сделано без исключений. Если это невозможно, например, если аргумент передается какой-либо другой программой или потоком, который вы не можете контролировать, то это невозможно, поэтому программа должна выполнить sh.

.
0 голосов
/ 03 мая 2020

Да, на мой взгляд, выбрасывать и перехватывать слишком много исключений - это грязно.

Вместо этого попробуйте подход, не выбрасывая исключения вообще.

Scanner sc = new Scanner(System.in);

int age = sc.nextInt();
while (age < 0) {
    System.out.println("Age entered is less than 0. Please enter again.");
    age = sc.nextInt();
}

Person p = new Person("SwagiWagi", age);

У вас всегда будет в этом случае положительный возраст.

Примечание: Введенное значение должно быть числом, или .nextInt() сгенерирует исключение, с которым вам придется работать.

...