2016-05-07 59 views
5

为了更具体一些,我想写一个代码,如果给定的值为负,则会抛出IllegalArgumentException。我应该在setter/constructor中包含这段代码还是应该在调用适当的方法时检查值? (例如:。start()init(),或print()任何run()在Java中的setter中抛出Exception是一个好习惯吗?

我的代码(简化):

public class LLUAlgorithm { 

private int temperature; 

public int getTemperature() { 
    return temperature; 
} 

public void setTemperature(int temperature) { 
    if (temperature < 0) 
     throw new IllegalArgumentException("can't be smaller than 0.") 
    this.temperature = temperature; 
} 

public void run() { 
    ... 
} 

我不记得,设定器抛出异常如上述的单一壳体。但我很好奇它是好还是坏。

+3

那么,例外名称包含_illegal argument_,所以当然你可以抛出它,当一个参数是非法的,如负数。是的,这可能发生在一个二传手中,我从来没有听说过,这将是不好的做法(因为它不是)。 – Tom

+1

是的,没关系,你甚至可以尝试更具体的例外...如果为空,如果是无效索引或定义自定义异常 –

+2

您应该抛出IllegalArgumentException。你可以用构建器模式过度使用它。您是否阅读过“Effective Java”一书,其中包含有关构建器模式的材料。 –

回答

4

最好的办法是让你的对象不变,摆脱你的制定者和否则抛出在构造函数中的异常无论你选择的方式,在一个错误的情况下,你有一个高风险,有你的对象在不一致的状态下会导致很难找到的错误。为了更好的理解,请阅读this,特别是与Failure Atomicity相关的部分。

+0

所以我明白了。如果我在我的情况下删除了setter,并将该异常放入构造函数中,那么该对象甚至不会被创建。否则,该对象将处于断开状态。非常感谢答案和链接。 – leventunver

相关问题