6

我讨厌声明抛出在任何情况下都不会被这个函数抛出的异常的函数。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 注释“未使用”,但其他用户可能会收到不需要的警告。

4

1 回答 1

5

就我个人而言,我会激活警告设置下的第二个选项:“忽略记录的异常......”并记录这些:

/**
 * @throws GeneralException when general stuff goes wrong
 * @throws StatusException when status stuff goes wrong
 */
protected int getStatus() throws GeneralException, StatusException {
    throw new GeneralException("One exception type in super type only");
}

也许包括一个更有用的解释,但基本上可以归结为这一点。

于 2013-10-07T11:15:39.290 回答