Я хочу создать исключение, чтобы пользователь знал, что вводимое значение возраста должно быть от 1 до 120. Найдите ниже пример.

Есть ли лучший способ выбросить исключение?

public class Lesson18Encapsulation3 {

    private int age;
    private String name;
    private int salary;

    public int getAge() {
        return age;
    }
    public void setAge(int age) {

        if ( age < 0 && age >= 120) 

            this.age = age;
        throw new IllegalArgumentException (" age can not be negative or more than 120");

//getters and setters

    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
public class Lesson18Encapsulation4 {

    public static void main(String[] args) {
        Lesson18Encapsulation3 emp = new Lesson18Encapsulation3();

        emp.setAge(220);
        emp.setName("None");

        System.out.println( "age : " + emp.getAge());
        System.out.println( "name : " + emp.getName());
    }
}
1
Jaime A 25 Сен 2018 в 11:00

2 ответа

Лучший ответ

Состояние неправильное. Вы хотите установить возраст только в том случае, если диапазон находится между 0 и 120:

if (age >= 0 && age < 120) {
    this.age = age;
} else throw new IllegalArgumentException("Age can not be negative or more than 120");

В качестве альтернативы (обратите внимание на измененный оператор ||, который означает или ):

if (age < 0 || age >= 120) {
    throw new IllegalArgumentException("Age can not be negative or more than 120");  
}
this.age = age;

Создание исключения при неправильном вводе вполне допустимо.

3
Nikolas 25 Сен 2018 в 08:04

В принципе, то, что вы делаете здесь, является примером дизайна по контракту: вы определение предварительного условия для вашего метода.

А) Неправильное состояние

Ваше состояние неправильное. Вы хотите выбросить исключение в прямо противоположном случае:

if(age < 0 || age >= 120) {
   // Throw exception
}

(На это также указал @Nikolas в более ранней публикации)

Б) Сделайте дизайн по контракту явным

Я бы сделал это явным, предоставив метод утверждения:

private void setAge(int age) {
    assertCorrectAge(age);
    this.age = age;
}

private void assertCorrectAge(int age) {
    if(age < 0 || age >= 120) {
        throw new IllegalArgumentException(" ... ");
    }
}

Некоторые люди предложат использовать сборку Java в ключевом слове assert. Я предлагаю не делать этого, потому что он отключен в большинстве версий JVM (поэтому он не срабатывает).

В) Используйте библиотеку

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

public void setAge(int age) {
    Preconditions.checkArgument(age >= 0, "negative age: %s", age);
    Preconditions.checkArgument(age < 120, "age too high: %s", age);
    this.age = age;
}
5
Maximilian C. 25 Сен 2018 в 09:17