1. ホーム

[解決済み】Javaでコンストラクタは例外を投げることができますか?

2022-04-05 11:19:35

質問

コンストラクタは例外を投げることができますか?

どのように解決するのですか?

はい、コンストラクタは例外を投げることができます。通常、これは新しいオブジェクトが直ちにガベージコレクションの対象となることを意味します(もちろん、しばらくは回収されないかもしれませんが)。しかし、コンストラクタの早い段階で自身を可視化した場合、quot; half-constructed" オブジェクトを残しておくことができます(静的フィールドを割り当てたり、コレクションに自身を追加したりなど)。

呼び出し元は (通常) 新しいオブジェクトを使用することができないため、コンストラクタでは、管理されていないリソース (ファイル ハンドルなど) を取得した後、それらを解放せずに例外をスローしないように注意する必要があります。たとえば、コンストラクタで FileInputStreamFileOutputStream が成功し、2つ目が失敗した場合、最初のストリームを閉じるようにしなければなりません。もちろん、例外をスローするのがサブクラスのコンストラクタであれば、これは難しくなります...すべてが少しトリッキーになります。あまり頻繁に起こる問題ではありませんが、検討する価値はあるでしょう。