我是否需要在每个构造函数上放置throws子句,或者只是将最终重载的构造函数传递给超类?
//Constructors
public ManufacturedPart(){
this(0, null, 0, 0, 0);
}
public ManufacturedPart(int id){
this(id, null, 0, 0, 0);
}
public ManufacturedPart(int id, double lCost, double mCost){
this(id, null, 0, lCost, mCost);
}
public ManufacturedPart(int id, String desc, double sellPrice, double lCost, double mCost){
super(id, desc, sellPrice);
setLaborCost(lcost);
setMaterialCost(mCost);
}
//Set Labor Cost
public void setLaborCost(double lCost) throws InvalidProductionArgumentException {
if(lCost < 0)
throw(new InvalidProductionArgumentException("Labor cost can't be less than 0"));
else if(lCost >= 0)
laborCost = lCost;
}
//Set Material Cost
public void setMaterialCost(double mCost) throws InvalidProductionArgumentException {
if(mCost < 0)
throw(new InvalidProductionArgumentException("Material cost can't be less than 0"));
else if(mCost >= 0)
materialCost = mCost;
}
答案 0 :(得分:2)
我是否需要在每个构造函数上放置throws子句,或者只是将最终重载的构造函数传递给超类?
您需要将它放在可能出现此异常的每个构造函数上。 e.g。
public ManufacturedPart(int id) { // thrown not possible
this(id, null, 0, 0, 0);
}
public ManufacturedPart(int id, double lCost, double mCost)
throws InvalidProductionArgumentException { // it could happen here
this(id, null, 0, lCost, mCost);
}
如果异常是经过检查的异常,您需要对其进行重构,这样您就不必处理可能发生的已检查异常。
public ManufacturedPart(int id) { // thrown not possible
super(id, null, 0); // use super instead of a constructor which throws an exception
}
答案 1 :(得分:1)
由于所有四个构造函数都调用抛出InvalidProductionArgumentException
的方法(直接或间接地,通过调用另一个构造函数)并且它们都没有处理该异常,因此所有构造函数都必须具有throws InvalidProductionArgumentException
子句。
这是假设InvalidProductionArgumentException
是一个经过检查的例外。
答案 2 :(得分:1)
您必须处理方法中调用的方法抛出的每个已检查异常,方法是捕获或添加throws
;构造函数是“特殊”方法,但不能免除此规则。
因此,如果构造函数调用throws InvalidProductionArgumentException
的方法,那么构造函数必须在构造函数体中catch (InvalidProductionArgumentException e)
(或超类型),或者添加throws InvalidProductionArgumentException
(或者超级输入构造函数签名。
如果从另一个构造函数调用该构造函数,并且您选择将throws
添加到“invoked”构造函数,那么“调用”构造函数也必须声明它throws
异常。
如果InvalidProductionArgumentException
是未经检查的异常(即它直接或间接地扩展RuntimeException
),则根本不需要显式处理异常。