質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

600閲覧

Javaのストリームなどで子クラスのオブジェクトをcloseすると親クラスのオブジェクトも自動的にcloseするという仕組みについて

yamamotoyama

総合スコア25

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

1クリップ

投稿2019/05/30 07:21

前提

JavaのStreamやReaderのソースコードで子クラスのオブジェクトを以下のようにclose()すれば親クラスの方も自動的にclose()するという仕組みがあります。

ソースコード1

Java

1BufferedReader in = null; 2try { 3    in = new BufferedReader(new FileReader("abc.txt")); 4} finally { 5//BufferedReaderを閉じればFileReaderも自動的に閉じる。 6 if (in != null){in.close();} 7}

質問

こういうのを見ていて思ったのですが、『親クラスと子クラスを別々に定義して、かつ親クラスはオブジェクト生成に成功、子クラスで例外が出て失敗』というようなケースでは親クラスのオブジェクトもcloseしなければならないのではないでしょうか?

例えば以下のようなケースです。

ソースコード2

Java

1FileReader parent = null; 2BufferedReader in = null; 3try { 4 parent = new FileReader("abc.txt"); 5    in = new BufferedReader(parent); 6} finally { 7//これじゃ足りないのではないか。 8 if (in != null){in.close();} 9}

これだとFileReaderのオブジェクトが開放されずにメモリリークが起こる可能性があるのではないかと考えています。
この問題意識は正しいでしょうか?

LouiS0616👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず, in = new BufferedReader(new FileReader("abc.txt")); という記述は

親クラスと子クラス

という関係ではありませんのでご注意を.


FileReader の後に BufferedReader を生成していますので, BufferedReader の生成に失敗した場合 FileReader の close が必要なのではないか, とのご指摘は, その通りだと思います.
ですが, 完璧を期そうとすると finally 内に close のために幾重も if 文が重なることになり, 記述方法に因っては, 例えばサンプル程度のコードでも大半が close の部分だったりと成りえます.
ですので, 生成は成功する前提で, アクセス中に異常があっても close は行うというカタチにしているのではないでしょうか.

とは言え, もちろん仕事としてこのような箇所があった場合は, どんなに巨大な見難い finally でも必要なら書かざるを得ません.
そのような状況からか, 最近は try が拡張され,

try(FileReader parent = new FileReader("abc.txt");   BufferedReader in = new BufferedReader(parent);){ }

といった書き方で, try(){} を抜けた場合に各ストリーム(正確には AutoCloseableオブジェクト) が close されるようになりました.

try-with-resources文の基本

それでも

try(BufferedReader in = new BufferedReader(new FileReader("abc.txt"));){ }

としてしまうとやはり FileReader は close されませんので, 分けて書くようにしましょう... ということになっているようです.

投稿2019/05/30 07:36

編集2019/05/30 09:45
jimbe

総合スコア13336

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問