🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

2回答

3887閲覧

finallyを利用してファイルを閉じる

firetruck

総合スコア4

Java

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

0グッド

0クリップ

投稿2019/09/10 07:49

編集2019/09/10 08:58

前提・実現したいこと

csvファイルを読み込むプログラムです。
例外発生時にはメッセージが表示されるようにしたいです。

発生している問題・エラーメッセージ

finallyを利用して、どんな場合でもクローズ処理が行われるようにしたかったですが、
finallyを追加したら、メッセージが表示されなくなりました。

「処理されない例外の型 FileNotFoundException」
「処理されない例外の型 IOException」

というエラーメッセージが出てきます。
例外処理と、finallyを利用したクローズ処理を同時にしたいですが、
どのように修正したらいいかがわかりませんでした。
ご教授お願いします。

該当のソースコード

java

1 File csv = new File(PATH); 2 FileReader fr = new FileReader(csv); 3 BufferedReader br = new BufferedReader(fr); 4 5 try { 6 String line; 7 while ((line = br.readLine()) != null){ 8 String[] info = line.split(",", -1); 9 10 for (String output : info){ 11 System.out.print("[" + output + "]"); 12 } 13 System.out.println(); 14 } 15 }catch (FileNotFoundException ex){ 16 System.out.print("ファイルが存在しません。"); 17 18 }catch (IOException ex){ 19 System.out.print("ファイルの読み込み中にエラーが発生しました。"); 20 21 }catch (Exception ex){ 22 System.out.print("システムエラー"); 23 24 }finally{ 25 br.close(); 26 fr.close(); 27 } 28 } 29}

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

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

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

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

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

m.ts10806

2019/09/10 07:53

「初心者アイコン」をつけておいてください。 できれば質問タイトルや本文は要件を書くことに終始してもらいたいので 「初心者です」などのあいさつはなくていいかなと個人的には思ってます。
firetruck

2019/09/10 09:00

初心者アイコンがあることを知りませんでした。ありがとうございます。
guest

回答2

0

close()がIOExceptionを出す可能性があるため、これをfinallyの中でtry-catchで囲う必要があります。

java

1 }finally{ 2 try { 3 br.close(); 4 fr.close(); 5 } 6 }

これでもbr.close()に失敗したらfr.close()が実行できないので、別々に囲うべきでしょうが…

Java7以降であれば、try-with-resources構文を使うとclose処理を明記せずに済みます。

投稿2019/09/10 08:07

swordone

総合スコア20669

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

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

Y.H.

2019/09/10 08:34

FileNotFoundExceptionについては、FileReaderの変数宣言とインスタンス生成を分離して、インスタンス生成をtry句のブロック内に移動する必要もありますね。(引きずられる形で、BufferedReader も同様)
guest

0

Java SE7以降であればtry-with-resources 文を使ってください。

try-with-resources文はtryまたはcatchブロックを抜けた時点でtry()の括弧内に書いたリソースを解放してくれます。そのため、わざわざfinallyブロックを用意してclose()を呼び出す必要がなくなります。

java

1 File csv = new File(PATH); 2 3 try ( 4 FileReader fr = new FileReader(csv); 5 BufferedReader br = new BufferedReader(fr); 6 ) { 7 String line; 8 while ((line = br.readLine()) != null){ 9 String[] info = line.split(",", -1); 10 11 for (String output : info){ 12 System.out.print("[" + output + "]"); 13 } 14 System.out.println(); 15 } 16 }catch (FileNotFoundException ex){ 17 System.out.print("ファイルが存在しません。"); 18 19 }catch (IOException ex){ 20 System.out.print("ファイルの読み込み中にエラーが発生しました。"); 21 22 }catch (Exception ex){ 23 System.out.print("システムエラー"); 24 25 } 26 } 27}

もしtry-with-resources文が使えない場合はfinallyブロックの中でtry-catch文を書き、そこでbr.close();fr.close();を呼び出してください。

投稿2019/09/10 08:02

編集2019/09/10 08:14
BluOxy

総合スコア2663

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問