java - 验证列表: prefer explicit IllegalArgumentException over automatic ArrayIndexOutOfBounds?

标签 java indexoutofboundsexception illegalargumentexception

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

现在我可以这样做:

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 有很多先例。

例如,ArrayList 执行自己的显式边界检查并抛出 IndexOutOfBoundsException 以及描述性消息(包括有问题的索引和数组大小),而不是让底层的数组访问因自身异常而失败(在本例中,该异常恰好是 IndexOutOfBoundsException 的子类,但这不是重点)。

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

在大多数情况下,我个人会选择#1 而不是#2,主要是因为它允许我更明确并提供清晰的(呃)异常消息。

关于java - 验证列表: prefer explicit IllegalArgumentException over automatic ArrayIndexOutOfBounds?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58318252/

相关文章:

java - SSL 通信 Java

java - 线程中的异常 "main"java.lang.ArrayIndexOutOfBoundsException : 15

java - 环绕网格 - 仅东/西错误

java - 获取异常 : java. lang.IllegalArgumentException:无法添加到布局:约束必须是字符串(或 null)

google-sheets - 非法参数异常 : Trying to set foreign cookie while downloading Google Spreadsheet via API?

android - 来自 gluUnProject 的 IllegalArgumentException

java - 在 JUnit 中测试 CharSequences 是否相等

java - 3d vector 的全局角度

java - JPA Web 应用程序管理策略

java - 通过 .nextLine 从文件中读取