3

次のようなコードがあるとします (これは悪い習慣だと認識しています)。

try {

new myObject();

} catch {

//stuff

}

返されたオブジェクトはどうなりますか? まだヒープに保存されていますか?これはコンパイル時エラーをスローする必要がありますか?

4

5 に答える 5

7

作成されると、すぐにガベージ コレクションの対象になります。

例外をスローする必要がある理由はわかりません (もちろん、MyObjectコンストラクターによって例外がスローされない限り)。これは完全に合法的な構文です。

于 2013-05-08T22:30:21.933 に答える
3

1) Yes, this code will produce a compile time error

try {
    new myObject();
} catch {             <-- syntax error
//stuff
}

2) If you were trying to catch a compile time error it would not work even with a correct syntax

3) try / catch の問題を修正すると、MyObject は (コンストラクターが例外をスローしない限り) 正常に作成されますが、コードのどこからも参照されないため、他のオブジェクトと同様に GC の対象となる可能性があります。「おそらく」必ずしもそうではないので、これを考慮してください

class MyObject {
    static MyObject myObect;  <-- this field will be preventing the instance from GC
     MyObject() {
         myObject = this;
     }
}

作成後、MyObject は自身への参照を静的フィールドに保存して保持しますが、 new MyObject() を呼び出すと、以前の参照が上書きされます。

于 2013-05-08T22:36:46.663 に答える
0

完全に有効なコードである可能性があるため、例外はスローされません。そのオブジェクトのコンストラクターには、副作用がある可能性があります。ファイルを書き込むことができます。静的変数をインクリメントできます。渡したオブジェクトを変異させる可能性があります。

于 2013-05-08T22:34:01.543 に答える