2016-04-01 17 views
0

各コンストラクタに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; 
    } 
+2

あなたのメソッドで呼び出されたメソッドによってスローされたすべての例外は、 'throws'をキャッチまたは追加することによって処理する必要があります。コンストラクタは「特別な」メソッドですが、このルールから除外されるわけではありません。 –

答えて

2

各コンストラクタにスロー句を入れるか、スーパークラスに渡される最後のオーバーロードされたコンストラクタだけを配置する必要がありますか?

この例外が可能なすべてのコンストラクタに配置する必要があります。例えば

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

すべての4つのコンストラクタは(別のコンストラクタを呼び出すことによって、直接または間接的に)InvalidProductionArgumentException投げる方法と、それらのどれもその例外を処理を呼び出すので、すべてがthrows InvalidProductionArgumentException句を持っている必要があります。

これは、InvalidProductionArgumentExceptionがチェック例外であると仮定しています。

+0

しかし、コンストラクタはthis()句を使用して最後の(4番目の)コンストラクタにチェーンされ、コンストラクタはすべての情報を持つスーパークラスに渡します。だから、最後の連鎖オーバーロードされたコンストラクタか、例外を引き起こす可能性のあるそれぞれのコンストラクタで? –

+1

@SephCordovano原因にかかわらず、少なくとも2つのコンストラクタがその例外をスローする可能性があります。 –

+1

@SephCordovano第4コンストラクタは、 'setLaborCost'と' setMaterialCost'を呼び出します。どちらも 'InvalidProductionArgumentException'節をスローします。つまり、4番目のコンストラクタには(例外をキャッチして内部的に処理しない限り) 'throws InvalidProductionArgumentException'節が必要です。他のコンストラクタは4番目のコンストラクタを呼び出すため、 'throws InvalidProductionArgumentException'句も必要です。 – Eran

1

あなたは、どちらか引くかthrowsを追加することで、あなたの方法で呼び出されるメソッドによってスローされたすべてのチェック例外を処理する必要が。コンストラクタは「特別な」メソッドですが、このルールから除外されるわけではありません。コンストラクタメソッドthrows InvalidProductionArgumentExceptionを呼び出す場合

だから、そのコンストラクタのいずれかcatch (InvalidProductionArgumentException e)(またはスーパータイプ)コンストラクタ本体内、またはコンストラクタシグネチャにthrows InvalidProductionArgumentException(またはスーパータイプ)を追加しなければなりません。

別のコンストラクタからそのコンストラクタを呼び出し、 "呼び出された"コンストラクタにthrowsを追加することを選択した場合、 "呼び出す"コンストラクタは例外も同様にthrowsと宣言する必要があります。


InvalidProductionArgumentExceptionは(すなわち、それは、直接または間接的にRuntimeException拡張)チェックされない例外の場合は、明示的にすべての例外を処理する必要はありません。

+1

'this(...)'呼び出しでスローされた例外を 'catch 'することはできません。 –

+1

ああ、決して知らなかった。しかし、今私は停止し、1秒間考える。更新しました。 –

+1

私はそれがうまくいかない理由を理解するまで私が試したので私は知っていた。 ;) –

関連する問題