Какое исключение Java я должен использовать? - PullRequest
4 голосов
/ 29 декабря 2008

Давайте предположим, что я полная ленивая задница, и я не хочу вкладывать несколько десятков нажатий клавиш, необходимых для моего собственного класса исключений (на самом деле это не очень важно, к чему привыкнуть). Тем не менее, чтобы сделать вид, что я следую хорошим практикам, я хочу использовать уже существующий, который наилучшим образом соответствует моей ситуации.

Проблема: Мне нужно выдать исключение, когда конструктор моего класса получает в своих параметрах объект, который не найден в заданном списке, который я построил где-то еще.

Какой класс исключений подойдет для этого?

Ответы [ 5 ]

20 голосов
/ 29 декабря 2008

IllegalArgumentException

12 голосов
/ 29 декабря 2008

Победитель по точности: java.lang.IllegalArgumentException

10 голосов
/ 29 декабря 2008

IllegalArgumentException - действительно ответ здесь, но я бы сказал, что у вас есть проблемы с вашим дизайном. По сути, ваш инвариант класса зависит от состояния некоторого внешнего объекта, что является нарушением инкапсуляции. Невозможно определить, будет ли вызов вашего конструктора успешным без знания какого-либо другого объекта, что приводит к запутанному и легко используемому API.

Эта проблема несколько смягчается, если список, на который вы ссылаетесь, является static final неизменяемым списком (см. java.util.Collections.unmodifiableList()) и содержится в рассматриваемом классе, но я до сих пор не очень его люблю. Лучше, если возможно, инкапсулировать приемлемые значения параметров в enum, что полностью исключит необходимость исключения. Я вообще не люблю исключения, сгенерированные из конструкторов. Если вы должны выбросить исключение, используйте вместо этого фабричный метод.

Если вам недоступен какой-либо вариант, который устраняет необходимость во внешнем списке, возможно, вам придется пересмотреть свой дизайн.

0 голосов
/ 29 декабря 2008

Если вы не боитесь взрыва в количестве классов, вы можете продлить IllegalArgumentException для этой ситуации.

 public class InvalidInstance extends IllegalArgumentException{
    private String[] parameter;

    public InvalidInstance (String[] param){
        this.parameter = param;
    }

    public String getMessage()
    String msg = "YOUR_MESSAGE";
    /* I think a string as "The currente object is
       invalid for parameter "+cycle for over parameter;*/
    msg += super.geTMessage();
    return msg;
}

public Constructor(parameter1,...){
    String[] param = new String[number_parameters]
    if...
    throws new InvalidInstance(param);
}

Таким образом, вы можете регистрировать все параметры, которые запускают исключение.

Этот код не очень красив для чтения: его можно использовать, если вы предпочитаете очень структурированный код. Простой IllegalArgumentException встречается чаще:)

0 голосов
/ 29 декабря 2008

На случай, если вы его не получили, IllegalArgumentException:)

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