验证列表:比自动 ArrayIndexOutOfBounds 更喜欢显式 IllegalArgumentException?

Validating a list: prefer explicit IllegalArgumentException over automatic ArrayIndexOutOfBounds?

我有一个 class 应该环绕在某些输入文件中找到的字符串。合同是该文件包含多个条目(由 # 字符分隔),准确地说:至少 两个条目应该来自该文件。

现在我可以这样做了:

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)。

注意:我不是问"what would be better",双方各有利弊(我有点倾向于选择选项1,因为它更短) .

#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)异常消息。