У меня есть открытый метод add(String), который вызывает частный метод inspectSequence(String), чтобы проверить, действительна ли строка или нет.

Этот метод возвращает массив, если переданный String действителен, если он недопустим, метод выдает IllegalArgumentException

Код следующий

public void add(String sequence) throws IllegalArgumentException{
  inspectSequence(sequence);
}

private int[] inspectSequence(String sequence){
  int[] array;
  //some actions
  if(<some condition>) throw new IllegalArgumentException("description");
  return array;
}

Таким образом, в случаях, когда недопустимые String были переданы в метод add, выходные данные будут следующими:

java.lang.IllegalArgumentException: description
at inspectSequence
at add

Но я не хочу, чтобы пользователь знал о частном методе inspectSequence, потому что это деталь реализации, верно?

Итак, что я могу сделать в таком случае? Будет ли здесь выбрасывать непроверенное исключение?

Также рекомендуется генерировать исключение внутри метода inspectSequence, иначе я должен вернуть null, если предоставленный String недействителен, а затем проверить возвращаемый результат в методе add и в зависимости от это выбросить или не выбросить исключение?

1
hotHead 22 Фев 2016 в 17:55

2 ответа

Лучший ответ

Но я не хочу, чтобы пользователь знал о частном методе inspectSequence, потому что это деталь реализации, верно?

Я бы сказал нет. Это правда, что вы не хотите, чтобы пользователь (что в данном контексте означает, что кто-то вызывает код) «знал» о внутренних методах, таких как inspectSequence(). Под словом «знать» я имею в виду уметь звонить, зависеть и т. Д.

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

Конечно, вы можете перехватить это исключение в вызывающем методе и выбросить другое, но это просто приведет к потере информации и может затруднить отладку / поддержку кода, поскольку информация где вход не был принят, будет потеряна звонящему.

Итак, что я могу сделать в таком случае? Будет ли здесь выбрасывать непроверенное исключение?

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

Предположим, что вызывающий абонент должен знать, что последовательность недействительна, и должен обрабатывать эту информацию соответствующим образом, например отображать некоторую информацию для конечного пользователя. В этом случае было бы лучше создать проверенное исключение, описывающее этот случай.

С другой стороны, если ввод нарушает контракт метода, то есть входная последовательность не должна никогда быть недействительной (или в противном случае это ошибка программирования), тогда IllegalArgumentException будет в порядке - ситуации например, передача null методу, который не ожидает нулевых параметров.

И неплохо было бы выбросить исключение внутри метода inspectSequence, или я должен вернуть значение null, если предоставленная строка недействительна, а затем проверить возвращаемый результат в методе добавления и в зависимости от него выбросить или не выбросить исключение?

Я бы сказал нет. Возврат null и последующая обработка этого в вызывающем методе может быть разумным способом в некоторых случаях (например, если у вас есть разные вызывающие объекты, которые обрабатывают null по-разному), но в вашем случае это не так. Это сделало бы код более сложным и, следовательно, его труднее было бы читать и поддерживать, тем более, что null может иметь несколько значений, которые вам нужно будет определить в этом случае.

6
Thomas 22 Фев 2016 в 15:04

Вы можете поймать IllegalArgumentException и выбросить собственное.

public void add(String sequence) throws MyCustomException {
    try {
        inspectSequence(sequence);
    } catch (IllegalArgumentException e) {
        throw new MyCustomException("more readable cause that hides internals");
    }
}
0
RichardK 22 Фев 2016 в 15:03