2014-11-26 4 views
3

Вопрос в том, требуется ли Throwexception или для предотвращения его возникновения. Это для игрового проекта.Бросить исключение или предотвратить его?

IndexOutOfBoundsException против кодирования вокруг него.

У меня есть List<E>

private Attribute<List> attributes; 

Способ получить элемент по индексу.

public Attribute getAttribute (int index) { 
    if (index < 0 || index >= attributes.size()) 
     index = 0; 

    return attributes.get(index); 
} 

В этом случае я не выполняю 1-й элемент списка.

+1

Представьтесь, что вы, как пользователь, играете в игру, выбирая вариант, а затем появляется это странное сообщение: 'IndexOutOfBoundsException при выборе оружия. Пожалуйста, сообщите администраторам игр. «Я не буду играть в эту игру ** когда-либо **. –

+0

Это была моя первоначальная мысль. Я колебался, потому что мне кажется, что я сделал что-то очень плохое, когда я поставил себя в эту ситуацию, если бы это произошло. – Emz

+0

Если вы пишете этот метод и знаете, что он может бросить это исключение в этих конкретных обстоятельствах, зачем вам писать код, который использует этот метод не так? Пользователю не понравится ваша игра, если она внезапно ошибается, игнорируя ошибки. И ошибки - ваш # 1 способ поиска ошибок. Передача индекса, который выходит за пределы, явно является ошибкой. – zapl

ответ

8

Неудача быстро, как правило, хорошая идея: если индекс -1 передан этому методу, это, вероятно, означает, что в коде, вызывающем метод, есть ошибка. Если вы молча используете index = 0 вместо: (a) вызывающий код может не получить ожидаемый результат, и (b) вы можете не заметить ошибку до тех пор, пока не исправит проблему.

Так что я бы просто использовать:

public Attribute getAttribute (int index) { 
    return attributes.get(index); 
} 

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

+0

Будет ли выход отладки защищать меня от этого, как вы думаете? Как сказал @Luiggi, это может быть немного больно, как игрок, чтобы испытать такую ​​ошибку. – Emz

+0

@Emz, если вы хотите получить атрибут по индексу, это, вероятно, означает, что вы знаете, сколько из них доступно, так что упоминания Луиджи не должны происходить. Если бы вы дали больше контекста, мы могли бы быть более конкретными. – assylias

+0

В настоящее время у меня больше нет контекста. В настоящий момент курс на Java напомнил, что важно всегда заботиться о худшем случае. (Этот проект не имеет ничего общего с курсом.) – Emz

4

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

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

1

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

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

Ответ на этот вопрос имеет хороший пост. When to throw an exception?

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