您好!
所以,关于何时抛出已检查或未经检查的异常,我仍然感到很自在。我想知道其他人认为在这种情况下最合适的是什么:
class Correlation<T>
{
private final T object1, object2;
private final double correlationCoefficient;
public Correlation(T object1, T object2, double correlationCoefficient)
{
if(Math.abs(correlationCoefficient) > 1.0 || (object1.equals(object2) && correlationCoefficient != 1.0))
throw new IllegalArgumentException();
this.object1 = object1;
this.object2 = object2;
this.correlationCoefficient = correlationCoefficient;
}
}
因此,在这种情况下,我想抛出运行时异常,因为我无法从用户传入错误数据的情况中轻松恢复。我想事先指出我无法控制传入的数据。如果可以,我会创建一个接口,保证构造函数中的条件为真。但是,这是已经计算过的相关性的便利类,因此我必须相信用户正在提供准确的信息。
好的,让我知道你们的想法!
答案 0 :(得分:6)
我认为这是正确的回应。您实际上正在做屏障断言,即屏障检查,如果它们错了,您拒绝创建实体。我会用java文档记录你可以抛出IllegalArgumentException,但是除此之外,它看起来是正确的。
Joshua Block提供了一些关于已检查和未检查异常的重要信息。基本前提是,除非您绝对希望有人检查异常,否则您应该抛出未经检查的异常。以这种方式思考会使一些编码和返回值复杂化,但通常它会使代码更清晰,更有效。对特殊情况使用例外情况,事情会更好地为您服务。
只需2美分。
修改强>
为了清楚起见,这里有类似你应该拥有的java文档:
/**
* <Something describing constructor, and what it does, ending with a period.>
*
* @param parameter <Describe the parameter - do one for each parameter of the constructor,
* and note which values may be illegal for that particular parameter.>
* @throws IllegalArgumentException <the case for the illegal argument exception.>
答案 1 :(得分:4)
在我看来,答案取决于:
有人会告诉您,您绝不应该使用已检查的例外情况。这纯粹是主观的。
答案 2 :(得分:2)
您应该始终在您的例外中包含解释性文字。在这种特殊情况下,您甚至可以考虑进行两次检查:
if(Math.abs(correlationCoefficient) > 1.0)
throw new IllegalArgumentException("abs(correlationCoefficient) > 1.0 - " + correlationCoefficient);
if((object1.equals(object2) && correlationCoefficient != 1.0))
throw new IllegalArgumentException("object1==object2, but correlationCoefficient != 1.0, " + correlationCoefficient);
这使得那些真正看到堆栈跟踪的人能够识别确切原因,而无需仔细查看代码。给定的例外应该只由一个条件触发,而不是几个,因为你不确定是什么发生了。还包括所有必要的信息,因为如果在测试场景中无法重现错误情况,这可能是至关重要的。