我在哪里将throws异常放在链式重载构造函数中?

时间:2016-04-01 07:21:19

标签: java constructor

我是否需要在每个构造函数上放置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;
  }

3 个答案:

答案 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),则根本不需要显式处理异常。