Когда бросать исключение во время выполнения?

Недавно у меня было интервью с компанией, и они дали мне проблему с кодированием. Мне была дана программа, связанная с колодой карт, и одним из способов было перетасовать колоду карт. Поэтому я написал программу как:

/** Shuffle the list of cards so that they are in random order 
 * @param d Deck of cards*/
public  static void shuffle(Deck d)
{
    if(d == null)
        throw new IllegalArgumentException();
    Random randomGenerator = new Random();
    List<Card> cards = d.getDeckOfCards();   // cards is basically Linked List.. cards = new LinkedList<Cards>()
    for(int i=0;i<cards.size();i++)
    {
        int randomNumber = randomGenerator.nextInt(52);
        Card c1 = cards.remove(randomNumber);
        Card c2 = cards.remove(0);
        cards.add(0, c1);
        cards.add(randomNumber,c2);
    }       

}

В приведенном выше коде я выбрал IllegalArgumentException, о котором я очень сомневаюсь. В каких условиях на самом деле нужно выбросить исключение во время выполнения? Должно ли мы фактически выбросить исключение во время выполнения?

Спасибо

Ответ 1

Должны ли мы фактически вызывать исключение во время выполнения?

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

В каких условиях должно фактически выполняться исключение во время выполнения?

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

Как правило, существуют две категории ситуаций, когда вам нужно выбросить исключение во время выполнения:

  • Передача недопустимых значений параметров. Это наиболее распространенная причина исключений во время выполнения. Большинство исключений проверки параметров должны быть исключениями времени выполнения. Java предоставляет несколько подклассов, чтобы сигнализировать об этих конкретных проблемах.
  • Методы вызова в неправильной последовательности. Это еще одна распространенная причина. Когда определенные методы не могут быть вызваны до тех пор, пока класс не завершит инициализацию или какие-либо другие подготовительные шаги, вызовы в неподходящее время должны вызывать исключения во время выполнения.

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

Ответ 2

IllegalArgumentException является, по сути, подклассом RuntimeException.

Лучше быть немного более конкретным, чтобы помочь другим программистам в будущем. Я определенно предпочел бы IllegalArgumentException, потому что он лучше всего описывает, что именно пошло не так, но на самом деле, любой из них будет работать.

Ответ 3

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

С другой стороны, если вы ожидаете возмещаемых ошибок, вы должны абсолютно поймать и обработать ошибки. Например, у вас могут быть пользователи, вводящие данные в форму. Если они вводят данные некорректно, ваш код обработки ввода может выдать исключение (например, NumberFormatException при анализе строки с неверными номерами). Ваш код должен улавливать эти исключения и возвращать пользователю ошибку, запрашивая правильный ввод.

При перехвате исключения и метании RuntimeException вместо этого важно установить исключение оригинала как причину исключения RuntimeException. то есть.

введите новый RuntimeException(originalException).