問題タブ [autocloseable]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - finalize メソッドでユーザーに表示される例外をトリガーする
この質問は、finalize メソッドの例外および同様の質問の反対です。
AutoCloseable
適切に閉じないと重大なリスクをもたらすクラスを作成しています。そのような場合に、ユーザーがうっかり忘れないように、フェイル ハードを探しています。
一般的なベスト プラクティスは、Closeable
s が正常に失敗し、発信者のエラーを軽減するために最善を尽くすことですが、この場合、発信者はこれを見逃すことはありません。概念的にこの考えに同意しない場合は、フィードバックをいただければ幸いです。ただし、その場合、質問は Java の内部に関する学術的な演習と考えてください。
私が想像しているのは、クラスのメソッドが呼び出され、インスタンスがまだクリーンアップされていないIllegalStateException
場合に、ユーザーを発生させて中断することです。finalize()
ただしfinalize()
、キャッチされていない例外を明示的に飲み込むため、これはトリッキーになります。RuntimeException
メソッドからユーザーに表示されるようにする最善の方法は何finalize()
ですか?
ここに私がこれまでに得たもののデモクラスがあります:
注: また、finalize()
実行が保証されていないことも認識しているため、このメソッドの周りに実装することは絶対に行われるわけではありません。GCが機会を与えてくれるなら、私はまだそれが起こることを望んでいます.
java - 複数の AutoCloseable をラップする
try
AutoCloseable
-with-resources は素晴らしいですが、複数のオブジェクトをラップするクラスを作成する場合、効果的なリソース管理にはまだ十分ではないように思えます。たとえば、
このラッパーには少なくとも 2 つの問題があります。
- 「bad-path」が無効で割り当てが
r2
スローされる場合、r1
は閉じられません。 - ラッパーの構築が成功した後に
r1.close
スローされた場合、r2
は閉じられません。
これらの問題はすべて対処できますが、2 つのリソースのみをラップする場合でも、ラッパーの作成は非常に簡単ではなく、エラーが発生しやすくなります。
ラッパーの作成を容易にするヘルパー クラスまたはその他の方法はありますか?
java - Javaのtry-with-resourcesコンストラクトでcatchの前にリソースのclose()メソッドが呼び出されるのはなぜですか?
たまたま気づいたのですが、これが事実です。以下の例を参照してください。
それは印刷します:
クローズしてみてください。 最後に
キャッチ
質問
try-with-resources は、null チェックを伴う煩雑な最終セクションを回避し、リソースのリークを回避するように設計されています。catch セクションの前にリソースが閉じられるのはなぜですか? その背後にある理由/アイデア/制限は何ですか?
java - AutoCloseable.close() メソッドは Java の下位互換性ルールを破りますか
Java 7 から、インターフェースを実装するすべてのクラスがステートメントで動作できるように、インターフェースCloseable
を拡張するようにインターフェースが改良されました。これまで、Closeable インターフェイスは、InterrruptedException を含む例外を自由にスローできました。ただし、Java 7 では、ステートメントで使用される Closeable インターフェイスのインスタンスは、try ブロックを終了した後に close メソッドが自動的に呼び出されると、InterruptedException をスローする可能性があり、暗黙的な呼び出しによって抑制される可能性があります。AutoCloseable
Closeable
try-with-resources
try-with-resources
InterruptedException
Throwable.addSuppressed(InterruptedException);
誰かが無意識のうちに例外を抑制し、プログラムが本来の動作をしていない可能性があることを考えると、これは Java の下位互換性ルールに違反しますか?
java - Java7がAutoCloseableを特別に導入するのはなぜですか?
AutoCloseable
はjdk1.7で導入され、Cloesable
すでにjdk1.5に含まれています。
そしてhttps://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.htmlによると
try-with-resources ステートメントは、各リソースがステートメントの最後で確実に閉じられるようにします。java.io.Closeable を実装するすべてのオブジェクトを含む、java.lang.AutoCloseable を実装するすべてのオブジェクトをリソースとして使用できます。
したがって、インスタンスはすでにステートメントCloseable
でリソースとして扱うことができます。から拡張されtry-with-resources
ているため、これは確かです。Closeable
AutoCloseable
私の質問は、なぜ Java が を特別に導入AutoCloseable
するのか、なぜ Closeable のみをサポートするようにしないtry-with-resources
のか、AutoCloseable を 以外に使用する方法はありますtry-with-resources
か?
java - 本体とは別に、try-with-resources からのオブジェクト構築中のエラーをキャッチします
概要
私はクローズ可能な型を持っています。CloseableClass
これは、コンストラクター、メソッド、さらには内部で IOError をスローできますclose
。私は try-with-resources を使用し、構築中のエラーを使用中のエラーとは異なる方法で処理したいと考えています (使用にはクリーンアップが含まれます)。さらに良いことに、保守可能なコードを書きたいと思っています。
クローズ可能なクラス インスタンスを構築し、それを try-with-resources ステートメントで使用したいとします。IOException
コンストラクターと、try-with-resources の本体で使用されるメソッドの両方をスローできます。
コンストラクターと本体でスローされたエラーを別々に処理したいとします。それを行うためのサポートされている方法はありますか? Python では、次のようにします。
ただし、Java では、オブジェクトに 2 番目の名前を割り当てないとできません。
これは主に の使用による「保守不可能なコード」であると言われましたがcloseable_
、私はそうは思いません。それをエミュレートするというさらに悪い問題があるため、try-finally の使用は避けたいと思います。
close
これには、テストクラスが従わないノーオペレーションであるために2回目の呼び出しが必要であることに注意してください(AutoCloseable
これは必要ではありませんが、必要ですCloseable
)。close
これは、投げられない場合は少し良くなりますが、それほどではありません。
基本的に問題は、
close
投げることができます- 二
IOException
重印刷を防ぐために対処する前に閉じる"Body error!"
- try-with-resources の複数の初期化子で機能させる方法は明らかではありません
- とにかくコードを複製することになります。
「保守不可能なコード」で生活することを余儀なくされていますか、それともこれに対処するための良い方法を見落としていますか?
java - Java 7、try-with-resources: Connection と PreparedStatement の作成を省略できますか?
ケース A:
ケース B:
A の場合con
、自動的に閉じられますps
。ケースBrs
はどうですか?ケース Bでは、変数がケース A のように作成されません。 con
ps
私の質問:両方のケースは完全に同一ですか? ケース Bに問題はありますか?