2014-12-18 5 views
10

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

/** 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 который я больше всего сомневался. В каких условиях на самом деле нужно выбросить исключение во время выполнения? Должно ли мы на самом деле выбросить исключение во время выполнения?

Благодаря

+0

«В приведенном выше коде я выбрал IllegalArgumentException, в котором я наиболее сомневаюсь». Вы имеете в виду 'throw new IllegalArgumentException();'? – motoku

+2

Я не вижу ничего плохого в том, что «неудачно рано» здесь, выбрасывая «IllegalArgumentException», тем более что «null» будет недействительным. Я бы, вероятно, подумал об использовании версии 'IllegalArgumentException', которая берет' String', чтобы описать, что пошло не так. Если shuffle был методом класса Deck, который бы устранил необходимость проверки нулей. –

+0

Из [javadoc] (http://docs.oracle.com/javase/7/docs/api/java/lang/IllegalArgumentException.html): * IllegalArgumentException: брошено, чтобы указать, что метод был передан незаконным или неуместным Аргумент * –

ответ

23

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

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

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

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

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

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

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

8

IllegalArgumentException is, in fact, a subclass of RuntimeException.

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

+0

Единственный правильный ответ imho, поскольку он указывает, что 'IllegalArumentException' является' RuntimeException' .. – displayname

2

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

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

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

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

Смежные вопросы