0

コンストラクターから例外をスローするトピックを読んでいます。スタックフローで同じトピックを少し調べた後。コンストラクターから例外をスローできるという結論に達しました。この問題は、コンストラクターが例外をスローする親をサブクラス化しようとすると発生します。たとえば、以下のコード スニペットを参照してください。

class  ParentConstructorException{
  public ParentConstructorException() throws IOException {

  }
}

public class TestConstructorException extends ParentConstructorException {
  public TestConstructorException() throws Exception{

  }
  //Causes compile time error if i don't throw exception
  public TestConstructorException(int x){

  }
} 

より広範な例外をスローする引数なしのコンストラクターを子クラスに提供しました。コンストラクターをオーバーロードすると、チェックされた例外を処理しなかったと表示されます。つまり、同じまたはより広いチェック例外をスローせずにサブクラスを開始できないということですか? 誰か説明してください。ベン

4

4 に答える 4

7

各サブクラスは、スーパークラス コンストラクターにチェーンされます。あなたの場合、それは暗黙的に起こっています-たとえば、これ:

public TestConstructorException(int x) {
}

と同等です

public TestConstructorException(int x) {
  super();
}

サブクラス コンストラクター内でそのスーパークラス コンストラクターによってスローされた例外をキャッチすることはできません。これは、スーパークラス コンストラクターへのチェーンがコンストラクター本体の最初のものでなければならないためtryです。ブロックを開始することさえできません。

では、スーパークラス コンストラクターが例外をスローした場合、サブクラス コンストラクターは何をすると予想されるでしょうか?

于 2013-07-17T20:08:09.880 に答える
1

コンストラクターをオーバーロードすると、チェックされた例外を処理しなかったと表示されます。つまり、同じまたはより広いチェック例外をスローせずにサブクラスを開始できないということですか?

super()サブクラスが実行される前に呼び出される例外を処理できません。

public TestConstructorException(int x){
  super(); // this throws IOException , and it's a checkedException so this won't compile
}

で試してみたらどうtry-catchですか?

これはコンパイルできません。これを行うことはできません。super()は最初のステートメントで呼び出されます

public TestConstructorException(int x){
 try{ 
 super(); // this throws IOException
}catch(IOException e){
 //do something
}

だからあなたも投げる必要があります

 public TestConstructorException(int x) throws IOException{

 }
于 2013-07-17T20:12:59.427 に答える
1

スーパー クラス コンストラクターは、サブクラス コンストラクターによってのみ、オブジェクト作成の過程でsuper()call を使用して呼び出されるため、サブクラス コンストラクターで同じ例外、または少なくともより広い例外を宣言する必要があります。明示的に指定するか、コンパイラーがすべてのコンストラクターの最初のステートメントとして追加します。

したがって、親クラスのコンストラクターが例外をスローすると、サブクラスのコンストラクターにスローされます。ただし、コンストラクターの最初のステートメントである必要があるため、呼び出しを囲むブロックを使用して例外を処理することはできません。そのため、例外がスローされると宣言されていると見なされない場合、コンパイラはそれをコンパイル時エラーとしてマークします。try-catchsuper()super()

于 2013-07-17T20:08:42.907 に答える