前提・実現したいこと
フォルダ内にある複数のファイルに関して、
同じ処理を行いたい。
また、例外が発生した場合は処理を抜ける
発生している問題・エラーメッセージ
抽象的で申し訳ないのですが、
for文の中にtry-catchブロックを書くことになんとなく違和感があるので、
以下のソースはjavaのお作法としてどうなのか、
ご教示いただけたらと思ってます。
該当のソースコード
java
1File[] files = new File("フォルダパス").listFiles(); 2 3 for (File file : files) 4 { 5 try (FileInputStream in = new FileInputStream(file)) 6 { 7 // 処理 } 8 catch (FileNotFoundException e) 9 { 10 e.printStackTrace(); 11 } 12 13 }
試したこと
try-with-resourcesではなく、
try-catchブロックを外出しにした方がいいのかで悩んでます。
外部からの呼び出しメソッド内です。
まだ自分の中で違和感がないのは以下です
Java
1FileInputStream fileInputStream = null; 2 try 3 { 4 for (int i = 0; i < files.length; i++) 5 { 6 fileInputStream = new FileInputStream(files[i]); 7 8 } 9 } 10 catch (FileNotFoundException e) 11 { 12 // 処理 13 } 14 finally 15 { 16 if (fileInputStream != null) 17 { 18 try 19 { 20 fileInputStream.close(); 21 } 22 catch (IOException e) 23 { 24 // 25 } 26 } 27 }
以下は通らないとわかっていますが、
これがなんとなくすっきりするというパターンです
※KSwordOfHasteさんの例5から
Java
1File[] files = new File("フォルダパス").listFiles(); 2 3 for (File file : files) 4 { 5 try (FileInputStream in = new FileInputStream(file)) 6 { 7 // 処理 } 8 }
補足情報(FW/ツールのバージョンなど)
Java8
ん~。例外が起きても処理を繰り返したいのか、そこで終わりたいのか次第な気がしますけどう~ん。
うむ、時と場合によるけど...
ファイル関連ならありかな?とは思う。
Exception捕捉して何をしたいかによりますね。
文法上間違いでなければ個人的な違和感は関係なく「あり」ですし。
返信ありがとうございます。
・例外が起きた場合、処理は中断したい
・ファイル読み込み関連
・文法上間違いはない(デバッグで確認済み)
となります。まとめてで申し訳ありません
すみません、上の文法上間違いを訂正で、
処理上の間違いはない、が正しいです。
Javaの文法に自信がありません・・・
コンパイル通れば文法に間違いはない ということにはなります。
反対に、どのような書き方なら、違和感がないのでしょうか。
テラテイルを始め、多くの技術系QAサイトは、技術的知見の蓄積こそがメインです。あなたの「違和感がある」というのは、良い情報だと思います。そこに、「こうだと違和感がない」というのがあれば、情報の価値がさらに上がると思います。ご一考ください。
デバッグしたわけではないのですが、
try
{
for (int i = 0; i < files.length ; i++)
{
FileInputStream in = new FileInputStream(files[i]);
// 処理
}
}
catch (FileNotFoundException e)
{
// 処理
}
finally
{
if (in != null)
{
in.close();
}
}
こういう感じならまだ違和感がないです。
それはそれで、質問本文に追記してください。
すみません、多分実際はfinallyのif (in != null)でこけると思うので、
またあとでちゃんと考えてから追記します。
スコープ外ですしね。
C#とJavaの「例外」に関しては、このあたりの記事かな。
http://d.hatena.ne.jp/j5ik2o/20091017/1255799827
https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/
Q71さん
ありがとうございます!nakamaさんの記事内の
>try-catch ブロックは、例外が発生しうる『1 行』のみを囲む。
これがもしかしたら頭の中にあって、混合していたのかもしれません(try-catch構文とtry-with-resources構文について)。
for文の中というよりは、読み込んだファイルについての処理を複数行にわたり記述することに違和感がよりあったのだと思いました。
何か違和感があるけど、これはJava初心者だからなのか、
そうではないのかがすっきりしなくて、今回質問させていただき、
その回答と自身の理解が得られてとても勉強になりました。
テラテイルの運営方針と違うかもしれませんが、大変助かりました。
今後も勉強続けていきます。
ここに記載することじゃないとはわかってるのですが、言い訳させてください。
言いたいこと伝えきれずで申し訳ありませんでした。その中で全部の情報を得て答えが得られたことに本当に感謝いたします。
回答5件
あなたの回答
tips
プレビュー