問題タブ [try-with-resources]
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 - Netbeans での try-with-resources の使用
Java サーブレット クラスに try-catch ステートメントがあります。Netbeans は次のエラーを表示します。
-source 1.6 では try-with-resources はサポートされていません (try-with-resources を有効にするには -source 7 以降を使用してください)
このエラーを取り除くにはどうすればよいですか?
java - Java 7 で StAX クラスが ARM 用に改良されなかった理由
Java 7にあると思っXMLStreamReader
ていましたが、そうではありません。AutoCloseable
StAX リーダー/ライター インターフェイスが実装のために改造されなかった (または改造されるべきではない) 技術的な理由はありますAutoCloseable
か? それらにはすでに close メソッドがあり、その意図は の close メソッドと変わりませんAutoCloseable
。
java - このコードがJDBC接続を閉じないのはなぜですか?(Java 7自動クローズ可能な予期しない動作)
java 7u5を使用し、try-with-resources構文を使用すると、次のコードがjdbc接続をリークしているように見えます。
次のコードは、期待どおりに機能します。
最初のケースでは、Connection.close()
メソッドが呼び出されていないようです。
最新のmysqlコネクタを使用しています。これは予期しない動作ですよね?
テスト
次のテストは印刷されませんCLOSED
:
不思議なことに、execute()
に変更された場合はreturn 0;
印刷CLOSED
されます。
javap -p-cTest.class出力
c# - JDK 7 を理解する - リソースで試す
私は .net 開発者です。最近、Java と C# の比較に興味を持ちました。C# の using ブロックに相当する Java の try-with-resources を見つけました。しかし、私はそれを完全には理解できませんでした。C# の using ブロックは言語機能であり、コンパイラはそのコードを生成することを知っています。try-with-resources について理解を深めたいのですが、いくつか質問があります。
C# の using ブロックに似た言語機能ですか?
以下に相当するJDK 6コードは何ですか:
/li>以下に相当するJDK 6コードは何ですか:
/li>C# の Reflector または ILSpy ツールに相当する Java は何ですか? つまり、Java バイト コード クラス ファイルを逆アセンブルし、その Java コードを表示するツールです。
java - 「自己抑制は許可されていません」とは一体何であり、Javacがこのエラーを引き起こすコードを生成するのはなぜですか?
この新しいJava7のtry-with-resourcesコンストラクトは非常に優れています。または少なくとも、例外が発生して私の一日を台無しにするまでは良かったです。
私はついにそれをJUnit+jMockだけを使用する再現可能なテストに要約することができました。
この例を実行すると、次のようになります。
ドキュメントを読むと、抑制された例外をそれ自体に追加し直すと、それがこのエラーのトリガーになると言われているようです。しかし、私はそれをしていません。try-with-resourcesブロックを使用しているだけです。次に、Javaコンパイラは、違法と思われるコードを生成します。これにより、機能が事実上使用できなくなります。
もちろん、テストに合格すれば問題はありません。また、テストが失敗すると、例外が発生します。これで、最初に発見した問題を修正したので、try-with-resourcesの使用に戻りました。しかし、次に例外が発生したときは、正当な理由がないように見える1つのJava自体が出力するのではなく、期待の失敗が例外になります。
それで...try-with-resourcesをあきらめることなく、ここで適切なエラー報告を取得する方法はありますか?
java-7 - try-with-resources: Java は .close() の呼び出しの順序を保証しますか?
Java 7 で try-with-resources を使用する場合、呼び出される順序に関する保証はあり.close()
ますか?
この機能を示す Oracle のサンプル コードを次に示します。
zf.close()
との両方writer.close()
が呼び出されます。注文は保証されていますか?
java - try-with-resources ブロックでチェーン化された複数のリソースを管理するための正しいイディオムは?
Java 7 のtry-with-resources構文 (ARM ブロック ( Automatic Resource Management ) とも呼ばれます) は、AutoCloseable
リソースを 1 つだけ使用する場合に便利で、短くて簡単です。FileWriter
ただし、相互に依存する複数のリソースを宣言する必要がある場合、たとえば aと aBufferedWriter
をラップする場合、どのイディオムが正しいかわかりません。もちろん、この質問は、AutoCloseable
これら 2 つの特定のクラスだけでなく、一部のリソースがラップされている場合にも関係します。
私は次の3つの選択肢を思いつきました:
1)
私が見た単純なイディオムは、ARM 管理の変数で最上位のラッパーのみを宣言することです。
これは素晴らしく短いですが、壊れています。基になるものは変数で宣言されていないため、生成されたブロックFileWriter
で直接閉じられることはありません。ラッピングfinally
の 方法 で のみ 閉じます . 問題は、のコンストラクターから例外がスローされた場合、その例外が呼び出されないため、基になるものが閉じられないことです。close
BufferedWriter
bw
close
FileWriter
2)
ここでは、基になるリソースとラッピング リソースの両方が ARM 管理の変数で宣言されているため、どちらも確実に閉じられますが、基fw.close()
になるリソースは 2 回呼び出されます。つまり、直接だけでなく、ラッピングを通じても呼び出されbw.close()
ます。
Closeable
のサブタイプであるAutoCloseable
両方を実装するこれら 2 つの特定のクラスでは、これは問題にはなりませんclose
。
このストリームを閉じて、それに関連付けられているシステム リソースを解放します。ストリームが既に閉じられている場合、このメソッドを呼び出しても効果はありません。
ただし、一般的なケースでは、 のみを実装するAutoCloseable
(および実装しない) リソースを持つことができます。これは、複数回呼び出すことができることをCloseable
保証しません。close
java.io.Closeable の close メソッドとは異なり、この close メソッドはべき等である必要がないことに注意してください。つまり、この close メソッドを複数回呼び出すと、目に見える副作用が生じる可能性があります。これは、複数回呼び出されても効果がないことが必要な Closeable.close とは異なります。ただし、このインターフェイスの実装者は、close メソッドを冪等にすることを強くお勧めします。
3)
fw
クリーンアップが必要な実際のリソースを表すのはのみであるため、このバージョンは理論的に正しいはずです。自体はbw
リソースを保持せず、 に委譲するfw
だけなので、基になる を閉じるだけで十分fw
です。
一方、構文は少し不規則であり、Eclipse は警告を発行します。これは誤報だと思いますが、それでも対処しなければならない警告です。
リソース リーク: 'bw' は決して閉じられません
では、どのアプローチを採用すればよいでしょうか。それとも、正しいものである他のイディオムを見逃したことがありますか?
eclipse - エラー:try-with-resourcesは-source1.6ではサポートされていません
LinuxDebian2.6.32-5-amd64を使用しています。私のバージョンのEclipse:4.2.0私のバージョンのJava:jdk1.7.0_07
プロジェクトをビルドすると、エラーが発生します。
コンパイラのコンプライアンスレベルを1.7に設定しています。なにが問題ですか?問題はありましたか?
java - リソースを試してソケットを閉じています
私は次の基本的な形式を持ついくつかの単純なソケットコードを書き込もうとしています-
私の問題は、ソケットが閉じられていることですが、そうあるべきではないと思います。try-with-resourcesはBufferedReaderを作成し、tryブロックを離れると自動的に閉じますが、何らかの理由でソケット全体も閉じます。したがって、後で同じソケットを使用する応答コードに到達すると、例外が発生します。これを修正する方法はありますか?または、リソースを試してみる必要はありませんか(理想的とは言えません)?
java - 「リソースを試す」に問題がある
明確にするために: Eclipseからのメッセージのためにコンパイルすらできません。最初のコードスニペット:input
とinputBuffer
は認識されません。2番目のコードスニペット、Eclipseはスイッチ「コンプライアンスとJREを1.7に切り替える」を要求しています
私はtry-with-resourcesを初めて使用しますが、構文や間違っていることを完全に理解することはできません。これが私のコードです
最後のブロックが機能しないので、試してみたかった
でも
また、BufferedReaderを
try (...)
...に追加する必要がありますが、どうすればよいですか?また、これには「コンプライアンスとJREを1.7に切り替える」必要があります。それが何を意味し、それが私のプログラムにどのように影響するかは今のところわかりません。誰かがそれが何を意味するのかを説明するか、私が何か間違ったことをしているのかどうかを説明するまで、私はそれをしたくありません。
編集
tryブロックの前に宣言を移動し、nullで初期化しましたが、これは「OK」ですか?