【发布时间】:2013-10-07 08:33:14
【问题描述】:
我讨厌声明抛出在任何情况下都不会被此函数抛出的异常的函数。如果在函数体中删除了 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");
}
}
现在车辆中的 StatusException 在 Eclipse 中被警告。
当然有人可能会说这是糟糕的设计等等,但从实用的角度来看,这将再次发生,并且很可能人们可以接受不改变架构,而是简单地将新的异常类型添加到 super类型。 但是在这种情况下如何消除误报警告呢? 当然可以将子选项与 javadoc 一起使用,但这也会忽略大多数真正的肯定命中。另一种选择是添加 SuppressWarning 注释“未使用”,但其他用户可能会收到不需要的警告。
【问题讨论】:
-
好吧,有些人认为所有异常都应该是未经检查的异常......
-
这是一个很好的观点。在我的案例中,我没有看到检查异常的任何优势。但这是遗留代码,我不确定是否可以将所有内容更改为未选中。但这可能是它没有自己的子选项的原因,因为没有人再使用检查异常了?
-
“忽略覆盖和实现方法”的简单英文阅读是 that 选项应该做你想做的事。也许是 Eclipse 中的错误?
-
@Raedwald 虽然我不是母语人士,但我不这么认为。这就是为什么我将所有这些解释都放在问题中,因为从超类型的角度来看,这是一种不同的情况。如果您需要扫描超类型中的所有实现,它也会影响性能。因此,可能需要启动一项功能请求以手动停用每种异常类型的警告,例如
@SuppressWarnings("unused")可以执行例如在函数参数中。但这不是eclipse的特性请求,而是通用的java(编译器)吧?