-3

私はこれを理解したことがありませんが、なぜ Java ではコンストラクターからチェック例外をスローできるのでしょうか?

public class PerformanceLogger{

    public PerformanceLogger() throws Exception{
        //do stuff
    }
}

このようなコードを持つことの影響は、クラス フィールド レベルでインスタンスをインスタンス化できないことです。

class MyClass {

    PerformanceLogger p = new PerformanceLogger(); //compile error  
}

機能する唯一のことは、メソッド内からコンストラクターを呼び出すことです。では、なぜわざわざ?Javaがコンパイル時にコンストラクターからのチェック例外のスローを許可しないとしたら、よりクリーンではないでしょうか?

4

6 に答える 6

2

これは、オブジェクトを返すメソッドとまったく同じ問題であり、それ以上でもそれ以下でもありません。

それを禁止する理由はありません。

また、禁止されている場合、コンストラクターは例外をスローする他のメソッドをどのように呼び出すのでしょうか? それらをすべてキャッチすることによって?

于 2013-03-19T16:32:19.343 に答える
1

クラス フィールドの初期化は、コンパイラによって自動的にコンストラクタに移動されます。つまり、次のようになります。

public class MyClass {
    private PerformanceLogger p = new PerformanceLogger();
}

以下と厳密に同一です。

public class MyClass {
    private PerformanceLogger p;
    public MyClass() {
        p = new PerformanceLogger();
    }
}

そうすれば、初期化を try-catch ブロックで囲むことができます。

この種の問題を回避するために、コンストラクター内でフィールドの初期化を維持するようにしてください。

于 2013-03-19T16:35:09.340 に答える
1

インスタンス変数をインスタンス化するべきではありませんinline:

declareそれらをassignコンストラクター内で使用する必要があります。

class MyClass 
{
    final PerformanceLogger p;

    public MyClass()
    {
        try { p = new PerformanceLogger(); }
        catch ( final Exception e ) { /* do something with it here */ } 
    }
}

static同じ方法で変数をインスタンス化します

class MyClass 
{
    static final PerformanceLogger P;

    static
    {
        try { P = new PerformanceLogger(); }
        catch ( final Exception e ) { /* do something with it here */ } 
    }
}
于 2013-03-19T16:33:18.680 に答える
0

いつ役立つかはわかりません。オブジェクトの作成時に何らかの IO 操作を実行する必要があるシナリオを考えてみましょう。コンストラクターはそうするのに最適な場所です。IO操作または信頼できない操作を実行すると、必ず例外が発生します。したがって、コンストラクターには、オブジェクトの作成が失敗したことを伝える方法が 1 つしかありません。つまり、値を返すことができないため、例外をスローすることです。

また、もう1つ、メソッド以外の静的ブロックまたはinitブロックでもチェック例外をスローするコンストラクターを使用して、このようなオブジェクトを作成できます。

于 2013-03-19T16:39:20.060 に答える
0

初期化ブロックを使用してそれらをインスタンス化できます。

class MyClass {
  PerformanceLogger p;
  {
    try {
      p = new PerformanceLogger();
    } catch (Exception e) {
      // Handle the exception here (omitted for brevity).
    }
  }
}
于 2013-03-19T16:37:51.770 に答える
0

例外が発生する可能性があるコンストラクターでコードを記述できます。クラスオブジェクトを呼び出すメソッドにその例外をスローする必要があります。

于 2013-03-19T16:38:16.683 に答える