Java 接口和 RuntimeExceptions 的模式

Java pattern for interfaces and RuntimeExceptions

我在我的项目中使用了以下模式。

public interface Foo {
  // When given a positive number, double it
  public Integer doublePositiveNumber(int number);
}
public class FooImpl {
  public Integer doublePositiveNumber(int number) {
    if (number < 0) {
      throw new IllegalArgumentException("number must be positive")
    }
    return number * 2;
  }
}

关于这个设计,有一个主要问题一直困扰着我。使用此接口实现的任何人都不清楚他们可能需要处理 IllegalArgumentException。同样,如果传入负数,我希望此接口的其他实现抛出此异常。

我想过几种解决方法:

1) 什么都不做,这个模式很好很正常

2) 改为抛出自定义检查异常。这感觉很尴尬,因为 IllegalArgumentException 非常适合这个错误。

3) 在方法签名中添加"throws IllegalArgumentException"。我在我的项目中使用的 java 代码质量扫描器声称在签名中抛出 RuntimeException 是一种代码味道,应该避免。

我希望有人可以阐明我想要做的事情是否有好的模式。我不知道我是过度设计还是正确地考虑了这种情况。

我会创建您自己的已检查异常 - 类似于 "NegativeNumberException",因为它描述了导致此错误的原因。

RuntimeErrorIllegalArgumentException 通常是为了在程序员错误的情况下抛出 - 如果您希望它被捕获,那么您应该使用已检查的。

您始终可以添加带有 @throws 注释的 Javadoc 连接,但根据您的描述,当调用者无法处理异常时让编译器停止运行会更好。