我讨厌声明抛出在任何情况下都不会被这个函数抛出的异常的函数。throw
如果在函数体中删除语句而不将其从throws
定义中删除,则在重构中会发生这种情况。
这就是为什么我激活设置 Java -> 编译器 -> 错误/警告 -> 不必要的代码 -> 抛出异常的不必要声明。
如果在接口或超级方法中定义异常,这会导致误报警告。如果接口的实现 A 没有抛出一种异常类型,但实现 B 却抛出了异常类型,则 eclipse 会警告实现 A 中不必要的声明。对于超级方法和覆盖方法同样如此。这就是我激活子选项“忽略覆盖和实现方法”的原因。
完美到这里。但我有相反的情况。被覆盖的方法抛出一个异常类型,该类型在 super 方法中没有使用。看这个最小的例子:
class Vehicle {
protected int getStatus() throws GeneralException, StatusException {
throw new GeneralException("One exception type in super type only");
}
}
class Car extends Vehicle {
@Override
protected int getStatus() throws GeneralException, StatusException {
throw new StatusException("Special case, that gets special handling");
}
}
现在在 Eclipse 中警告车辆中的 StatusException。
当然有人可能会说这是糟糕的设计等,但从实用的角度来看,这将再次发生,并且很可能人们可以接受不改变架构,而是简单地将新的异常类型添加到超类型。但是在这种情况下如何摆脱误报警告呢?当然,可以将子选项与 javadoc 一起使用,但这也会忽略大多数真正的正面命中。另一种选择是添加 SuppressWarning 注释“未使用”,但其他用户可能会收到不需要的警告。