Проверка списка: предпочитаете явное исключение IllegalArgumentException автоматическому ArrayIndexOutOfBounds? - PullRequest
2 голосов
/ 10 октября 2019

У меня есть класс, который должен обернуться вокруг строк, найденных во входном файле. Контракт заключается в том, что эти файлы содержат несколько записей (разделенных # символами), если быть точным: как минимум две записи должны появиться из этого файла.

Теперь я могу сделать это:

public MyWrapper(List<String> fileEntries) {
   if (fileEntries.size() < 2) { 
     throw new IllegalArgumentException("Not enough entries ...
   }

или я мог бы просто сделать:

public MyWrapper(List<String> fileEntries) {
   this.firstEntry = fileEntries.get(0);
   this.secondEntry = someMethodThatMergesAllRemainingEntries(fileEntries);

Эта вторая часть в какой-то момент выдаст ArrayIndexOutOfBound.

Мой вопрос: есть ли какой-нибудь прецедент в стандартной библиотеке Java, которую можно рассматривать как руководство? (аналогично вызову стандартной библиотеки Java requireNonNull(), который говорит нам, возможно, предпочтительнее бросить NPE вместо IllegalArgumentException для нулевых аргументов).

Примечание: я не спрашиваю "что бы«Будь лучше», у обеих сторон есть свои плюсы и минусы (я немного склонен предпочесть вариант 1, так как он просто короче).

1 Ответ

4 голосов
/ 10 октября 2019

Существует множество прецедентов для # 1.

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

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/ArrayList.java#l1200

Я лично выбрал бы № 1 вместо № 2 в большинстве случаев, в первую очередь потому, что это позволяет мне быть более явным и предоставлять четкое (er) сообщение об исключении.

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