コンストラクタは例外をスローできますか?コンストラクタはJavaで例外をスローできますか?
答えて
はい、コンストラクタは例外をスローすることができます。通常、これは新しいオブジェクトがすぐにガベージコレクションの対象となることを意味します(ただし、しばらくは収集できません)。 「半構造」オブジェクトは、コンストラクタの前に表示されている場合(たとえば、静的フィールドを割り当てたり、コレクションに追加するなど)には使用できます。
呼び出し元(通常は)が新しいオブジェクトを使用する方法を持たないため、コンストラクタはアンマネージリソース(ファイルハンドルなど)の取得を避けるように注意する必要があります。解放しないで例外をスローします。たとえば、コンストラクタがFileInputStream
とFileOutputStream
を開こうとしたときに、最初のコンストラクタが成功しても2番目のコンストラクタが失敗した場合は、最初のストリームを閉じようとする必要があります。例外をスローするサブクラスのコンストラクタであれば、これはもっと難しくなります。もちろん、それは少し難解です。それは非常に頻繁に問題ではありませんが、検討する価値があります。
絶対に。
コンストラクタが有効な入力を受け取らないか、有効な方法でオブジェクトを構築できない場合は、例外をスローして呼び出し元に警告する以外のオプションはありません。
はい。
コンストラクタは特別なメソッドであり、他のメソッドと同様に例外をスローすることができます。
をして投げることができますあなたの声明で重要なのは「特別な方法」です。だから彼らは他の方法のようではありません。非最終クラスのコンストラクタ**から例外をスローすると、セキュリティホールが作成される可能性があるので、これを行うには特別な注意が必要です。上記の@Billyによる回答と、Javaセキュアコーディングガイドラインの抜粋を参照してください。 –
はい、コンストラクタは例外をスローすることができます。
ただし、例外をチェックする場合は、例外をチェックするかチェックしないかを選択するのが賢明です。未チェックの例外は、基本的にRuntimeExceptionのサブクラスです。
ほとんどの場合(私はこのケースの例外を思いつくことができませんでした)、チェック例外を投げる必要があります。その理由は、NullPointerExceptionのようなチェックされていない例外は、通常、プログラミングエラー(入力を十分に検証しないなど)によるものです。
チェックされた例外が提供する利点は、プログラマがインスタンス化コードで例外を捕捉し、オブジェクトインスタンスの作成に失敗する可能性があることです。もちろん、コードレビューだけでは、例外を飲み込むプログラミングの習慣が貧弱になることがあります。
はい、例外をスローすることができます。そうであれば、それらは部分的にのみ初期化され、非最終的であれば攻撃の対象となります。
以下はSecure Coding Guidelines 2.0のものです。
非最終的なクラスの部分的に初期化されたインスタンスには、ファイナライザ攻撃を介してアクセスできます。攻撃者は、サブクラスのprotected finalizeメソッドをオーバーライドし、そのサブクラスの新しいインスタンスを作成しようとします。上記の例では、ClassLoaderのコンストラクタのSecurityManagerチェックでセキュリティ例外がスローされますが、攻撃者は例外を無視して部分的に初期化されたオブジェクトに対して仮想マシンがファイナライズを実行するまで待機します。これが発生すると、悪意のあるファイナライズメソッドの実装が呼び出され、攻撃者はファイナライズされるオブジェクトへの参照をこのオブジェクトにアクセスできます。オブジェクトは部分的にのみ初期化されますが、攻撃者は引き続きメソッドを呼び出すことができます(これにより、SecurityManagerのチェックを回避します)。
これは、最終的でないクラスから投げることがセキュリティ侵害であることを意味しますか?これはまだ問題なのでしょうか? – kroiz
このガイドラインは、コードがセキュリティが重要なコンテキストで使用されている、または使用される可能性が高い場合にのみ関連します。たとえば、ほとんどのJavaコードは、SecurityManagerが存在しないコンテキストで使用されます。 –
コンストラクタは例外をスローすることができます。しかし、いずれかのサブクラスコンストラクタが例外をスローするスーパークラスコンストラクタを呼び出す場合、サブクラスコンストラクタは例外をキャッチするかスローする必要があります。
super()がコンパイルエラーを引き起こす前にtryブロックを使用するので、サブクラスコンストラクタは例外をキャッチできません( "superはコンストラクタの最初のステートメントでなければなりません") –
はい、それは例外をスローすることができますし、次の例に示す過ぎるようコンストラクタの署名にそれを宣言することができます。
public class ConstructorTest
{
public ConstructorTest() throws InterruptedException
{
System.out.println("Preparing object....");
Thread.sleep(1000);
System.out.println("Object ready");
}
public static void main(String ... args)
{
try
{
ConstructorTest test = new ConstructorTest();
}
catch (InterruptedException e)
{
System.out.println("Got interrupted...");
}
}
}
- 1. コンストラクタとスロー例外
- 2. Java beanで例外をスローすることができます
- 3. Jackson MapperはAndroidでは例外をスローしますが、Java SEでは例外をスローしません
- 4. Angular2、コンストラクタDI例外をスローする
- 5. C++でコンストラクタから例外をスローする
- 6. ラムダで例外をスローする - java 8
- 7. Javaで例外をスローする
- 8. Javaで例外をスローする
- 9. Java再スロー例外
- 10. コンストラクタは新しい例外をスローしませんか?
- 11. static_castはC++で例外をスローできますか?
- 12. EJB3コンストラクタが例外をスローしますか?
- 13. resultset.last()はJavaで例外をスローします
- 14. C++クラスのコンストラクタで例外をスローする
- 15. セレンメソッドはどのような例外をスローできますか?
- 16. エンタープライズロギングライブラリは例外をスローできますか?
- 17. Javaでの例外の再スロー
- 18. FxCopはコマンドラインで例外をスローしますが、GUIでは例外をスローしませんか?
- 19. チェーンオーバーロードされたコンストラクタでスロー例外をどこに配置しますか?
- 20. DLL境界を越えてコンストラクタから例外をスローする
- 21. serversocket.accept()はいつ例外をスローしますか? [java]
- 22. .NETのコンストラクタから例外をスローする
- 23. コンストラクタが例外をスローした後にfinalizeを呼び出すことはできますか?
- 24. Javaインターフェイスは例外をスローしますが、インターフェイス実装は例外をスローしません。
- 25. 例外から例外をスローする
- 26. EclipseLinkは例外をスローしますか?
- 27. OpenFileDialog.ShowDialog()は例外をスローしますか?
- 28. カスタム例外コンストラクタでsilex $ appにアクセスできますか?
- 29. 非同期I/Oはキャッチできない例外をスローできますか?
- 30. コンストラクタでのデータの検証と例外のスロー
+1。通常、サブクラスによってスローされる例外は誰も考えません。 –
@JonSkeet:**コンストラクタの前に(*静的フィールドを割り当てたり、コレクションに自身を追加するなどして)* *についてのコード例をいくつか教えてください。 – Tarik
@Tarik:コード例はまあまあです。コンストラクタ内の 'someStaticField = this;'または 'someCollection.add(this)'です。 –