Обработка исключений при вызове метода - PullRequest
0 голосов
/ 04 мая 2018

Скажем, у меня есть один метод 'position', который берет 2 координаты и создает объект позиции для их удержания. Чтобы убедиться, что эти координаты не выходят за пределы, генерируется исключение InvalidPositionException.

public Position(int x, int y) throws InvalidPositionException {
    try {
        if (x > 10 || x < 1 || y>10 || y<1) {   
            throw new InvalidPositionException("Position x = "+x+", y = "+y+" is out of bounds");
        } else {
            setX(x);
            setY(y);
        }
    } catch (InvalidPositionException e) {
        System.err.println(e);
    }
}

Если я теперь хочу создать новый объект позиции из другого класса, я получаю сообщение об ошибке «не зарегистрированное исключение InvalidPositionException; должно быть перехвачено или объявлено как выброшенное» *

Как я могу заставить эту работу работать без объявления «бросков» в сигнатуре метода, создающего новый объект позиции?

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Вы должны включить блок try-catch вокруг оператора, который создает объект Position.

Position myPosition = null;
try {
  myPosition = new Position(a, b);
}
catch (InvalidPositionException e) {
  // do something if the exception is caught
}
0 голосов
/ 04 мая 2018

С Эффективная Ява Джошуа Блох

Пункт 72: предпочитайте использовать стандартные исключения

Атрибут, который отличает опытных программистов от менее опытные, что эксперты стремятся и обычно достигают высокого степень повторного использования кода. Исключения не являются исключением из правила Повторное использование кода - это хорошо. Библиотеки Java предоставляют набор исключения, которые покрывают большинство потребностей в создании исключений большинства API-интерфейсы. ...

Исключительные случаи IllegalArgumentException для использования - ненулевое значение параметра не подходит

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

public Position(int x, int y) {
    if (x > 10 || x < 1 || y>10 || y<1) {   
        throw new IllegalArgumentException("Position x = "+x+", y = "+y+" is out of bounds");
    } 
    setX(x);
    setY(y);
}

P.S. вы, вероятно, можете просто заменить setX(x) на this.x = x и то же самое для y (если в этих установщиках нет никакой дополнительной логики).

0 голосов
/ 04 мая 2018

Перейдите в класс InvalidPositionException и сделайте его наследником от RuntimeException.

RuntimeException s являются непроверенными исключениями, это означает, что компилятор не заставляет вас иметь дело с ними. Хороший пример этого, когда вы выходите за пределы своего массива. Вам не нужно писать код, который решает эту проблему каждый раз, когда вы обращаетесь к массиву (например, как мы обрабатываем IOException). Аналогичный пример - NullPointerException. Однако в обоих случаях вы могли бы написать код, чтобы перехватить исключительную ситуацию и обработать ее.

Еще один способ справиться с проблемой, если вы являетесь проверенным пуристом исключений и не хотите блока try-catch, - это очистить данные на любом экране, на котором вы вводите данные, и сказать, что они выходят за пределы.

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