[解決済み] なぜCatchやFinallyを使わずにTry-With-Resourcesを記述するのか?
質問
次の例のように、CatchやFinallyを付けずにTryを書くのはなぜですか?
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
/* TODO output your page here. You may use following sample code. */
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet tryse</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet tryse at " + request.getContextPath() + "</h1>");
out.println("</body>");
out.println("</html>");
}
}
解決方法は?
上記で説明したように、これはJava 7以降の機能です。
try with resources
を記述するのを省略できます。
finally
で使用されているすべてのリソースをクローズします。
try-block
を使用します。で述べたように
ドキュメント
java.lang.AutoCloseableを実装したオブジェクト(java.io.Closeableを実装した全てのオブジェクトを含む)は、リソースとして使用することが可能です。
このコード例を参照してください。
static String readFirstLineFromFile(String path) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}
この例では、リソースは
BufferReader
オブジェクトを実装しており、そのクラスは
java.lang.AutoCloseable
で、try ブロックが正常に実行されたかどうかにかかわらず閉じられます。
br.close()
を明示的に指定します。
ここでもう一つ重要なことに気づかされます
は、もしあなたが
finally
ブロックと
try
と
finally
ブロックが例外をスローした場合、その例外は
try
ブロックは抑制されます。
一方
try-with-resources
文の両方で例外が発生した場合
try
ブロックと
try-with-resources
ステートメントを使用する場合、このケースでは
try-with-resources
ステートメントが抑制されます。
上記の@Aaronがすでに回答しているように、私はちょうどあなたを説明しようとしました。お役に立てれば幸いです。
出典 http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
関連
-
[解決済み] 未処理の例外タイプIOException」が表示されるのですが?
-
[解決済み] このフォーマット(Tue Jul 13 00:00:00 CEST 2010)の日付をJavaの日付に変換する方法(文字列はalfrescoのプロパティに由来しています)
-
[解決済み] mavenのコンパイルに失敗するのはなぜですか?
-
[解決済み] java.lang.ClassNotFoundException: クラス com.ibm.db2.jcc.DB2Driver が Worklight プラットフォームまたはプロジェクトに見つかりませんでした。
-
[解決済み] Apache Camelのログに簡単なテキストを記録する
-
[解決済み] アクティビティに割り当てられない
-
[解決済み] タイプの安全性。アンチェック・キャスト
-
[解決済み] 文字列の巻き方
-
[解決済み] Javaでdoubleをfloatに変換する
-
[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] maven. -source 1.5ではラムダ式がサポートされていません。
-
[解決済み] Java の substring() の時間複雑性
-
[解決済み] プロトコルハンドラの初期化に失敗しました。
-
[解決済み] javacが「using unchecked or unsafe operations」という警告を出す原因は何ですか?
-
[解決済み] javascriptでExpression言語を使うには?
-
[解決済み] raw 型のメンバへのアンチェックの呼び出し
-
[解決済み] アニメーションGIFの表示
-
[解決済み] スリーピング中のスレッドが割り込まれ、データベースへの接続が失われる
-
[解決済み] Maven: assembly-pluginが全く実行されない
-
[解決済み] java.io.IOException。DER長の短い読み取り