2009-08-03 73 views
3

可能重复:
When to choose checked and unchecked exceptions经过或未经检查的异常

您好!

所以,我仍然很清楚什么时候抛出checked或unchecked异常。我想知道别人怎么想是最合适在这种情况下:

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; 
    } 
} 

所以,在这种情况下,我想抛出一个运行时异常,因为我不能轻易从用户传递的情况中恢复坏数据。我想事先指出我无法控制传入的数据。如果可以,我会创建一个接口,以确保构造函数中的条件为真。但是,这是已经计算出的相关性的便利类,所以我必须相信用户正在提供准确的信息。

好吧,让我知道你们都在想什么!

+2

我会指导您http://stackoverflow.com/questions/27578/when-to-choose-checked-and-unchecked-exceptions – 2009-08-03 20:40:05

+0

您使用IllegalArgumentException(运行时异常)是有效的,因为参数是非法的(根据构造函数的期望(应该在JavaDocs中记录))。 – 2009-08-03 21:13:51

回答

4

在我看来,答案取决于:

  • 你预计呼叫者能够正常恢复?
  • 此API旨在用于公共或内部消费吗?

有人人会告诉你,你不应该使用checked异常。这完全是主观的。

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.> 
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); 

这让那些究竟是谁在这里看到的堆栈跟踪,以能够识别的确切原因,而无需在代码密切期待。一个特定的例外应该只能由一个条件而不是几个来触发,因为你不能确定发生了什么。还包括所有必要的信息,因为如果错误情况无法在测试场景中复制,这可能至关重要。

相关问题