次のようなコードがあるとします (これは悪い習慣だと認識しています)。
try {
new myObject();
} catch {
//stuff
}
返されたオブジェクトはどうなりますか? まだヒープに保存されていますか?これはコンパイル時エラーをスローする必要がありますか?
次のようなコードがあるとします (これは悪い習慣だと認識しています)。
try {
new myObject();
} catch {
//stuff
}
返されたオブジェクトはどうなりますか? まだヒープに保存されていますか?これはコンパイル時エラーをスローする必要がありますか?
作成されると、すぐにガベージ コレクションの対象になります。
例外をスローする必要がある理由はわかりません (もちろん、MyObject
コンストラクターによって例外がスローされない限り)。これは完全に合法的な構文です。
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() を呼び出すと、以前の参照が上書きされます。
完全に有効なコードである可能性があるため、例外はスローされません。そのオブジェクトのコンストラクターには、副作用がある可能性があります。ファイルを書き込むことができます。静的変数をインクリメントできます。渡したオブジェクトを変異させる可能性があります。