【问题标题】:What exception should I throw in java when I detect something is wrong?当我检测到有问题时,我应该在 java 中抛出什么异常?
【发布时间】:2016-01-22 00:35:52
【问题描述】:

假设我有一个存储学生姓名的文本文件和另一个存储他们成绩的文本文件,我正在尝试将它们合并到一个文本文件中(或者可能正在进行其他处理)。进一步假设我编写了一个类,它提供了一个迭代器,它基本上抽象出了数据存储在两个单独文件中的事实。这个迭代器会有这样的方法:

public class MyIterator
{
   public boolean hasNext()
   {
       boolean a = this.nameReader.hasNext();
       boolean b = this.gradeReader.hasNext();
       if (a != b)
       {
          // the number of records in the two files don't match; 
          // most likely input is wrong and user should be alerted about it
          // **Question: What exception should I throw here?**
       }
       return a;
   }

   public MyTuple next()
   {
       // read the next records from both files and
       // combine them into a tuple 
   }
}  

Java 有IllegalStateException,但它的描述与这里的问题不匹配。

IllegalStateException : 表示方法已在非法或不适当的时间被调用。换言之,Java 环境或 Java 应用程序未处于请求操作的适当状态。

【问题讨论】:

  • 标准的是IllegalArgumentException,但在这种情况下,您可能想定义自己的,因为您可能会将其与所有其他问题分开处理。
  • 除非有IncorrectFileArgumentException,否则您应该创建自己的
  • 当您将数据存储在文件中时..也许您可以抛出EOFException
  • 程序的用户有机会解决问题吗? - 此外,以 99% 的输出运行程序并然后抛出异常不是一个好策略。此类数据错误应在任何处理之前发出信号。
  • 我不认为IllegalArgumentException 是一个好的选择:没有任何参数被传递给hasNext 是非法的。我会选择IllegalStateException

标签: java


【解决方案1】:

鉴于您正在实现接口的方法,并且该方法不会引发任何已检查的异常,因此您只能使用 RuntimeException 的子类。

如果现有的子类都不适合您的情况,您始终可以创建自己的子类,尽管对于未经检查的异常通常不太推荐这样做(因为它们不会自动出现在 JavaDoc 中)。记录您在 JavaDoc 中为您的班级提供的任何内容非常重要。

如果要求我为您描述的情况选择一个现有的运行时异常,我可能会选择 UncheckedIOException 包裹在 EOFException 周围。

【讨论】:

  • 我没有实现任何接口。我还应该使用未经检查的异常吗?
  • 我以为你正在实现Iterator 接口。如果你正在制作一个“类似迭代器”的类,你应该是。但是如果你没有实现它,你可能应该使用检查异常,因为它们有更多的文档记录。
【解决方案2】:

IllegalArgumentException 是一个很好的抛出异常,但如果它不能满足您的需求,您可以随时创建自己的异常。请记住,您并不总是希望向公众显示异常的结果,因此您可能希望在记录异常结果时以不同的方式处理该异常。

【讨论】:

  • "IllegalArgumentException 是一个很好的抛出异常" 为什么你认为没有参数的方法应该抛出一个IllegalArgumentException
  • 考虑将其更改为 IllegalStateException,我认为它更接近于无效状态,IllegalStateException 的documentation 表示:表示方法已被非法或不适当地调用时间。换言之,Java 环境或 Java 应用程序未处于适合请求操作的状态
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 2013-05-20
  • 2014-04-18
  • 2020-03-01
  • 1970-01-01
相关资源
最近更新 更多