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

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

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

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

Q&A

解決済

2回答

368閲覧

try/catchの使い方

uer03108

総合スコア194

Java

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

0グッド

1クリップ

投稿2017/10/29 04:56

try/catchの使い方なのですが。

下記はファイルをコピーペーストする関数になります。
処理が正常に行われたかを判断するためにtry/catchを使用したのですが、行数が倍くらいになりました。
処理結果が判断できて、かつ行数の少ない記述を考えています。

下記の様な行数の減らし方は思いつきました。
・部分的にtry/catchを使用する。
・void型にして関数の呼び出し元でtry/catchを使用する。
・この関数に限って言えば、try/catchなしの関数を使用して、下記を追記する。

java

1if(!new File(pathTo).exists()){処理}

2番目が妥当でしょうか。
それとも可読性よりは機能性を優先した方が良いでしょうか。


try/catchなし

java

1 //ファイルコピー・貼り付け(try/chatchなし) 2 private boolean CopyPaste(String pathFrom, String pathTo) throws IOException { 3 4 //コピー元 5 FileInputStream fileIn = new FileInputStream(pathFrom); 6 7 //コピー先 8 FileOutputStream fileOut = new FileOutputStream(pathTo); 9 10 // byte型の配列を宣言 11 byte[] buf = new byte[256]; 12 int len; 13 14 // ファイルの終わりまで読み込む 15 while((len = fileIn.read(buf)) != -1){ 16 fileOut.write(buf,0,len); 17 } 18 19 //ファイルに内容を書き込む 20 fileOut.flush(); 21 22 //ファイルの終了処理 23 fileOut.close(); 24 fileIn.close(); 25 26 return true; 27 }

try/catchあり

java

1 //ファイルコピー・貼り付け(try/catchあり) 2 private boolean CopyPaste(String pathFrom, String pathTo) { 3 4 boolean bl = false; 5 6 FileInputStream fileIn = null; 7 FileOutputStream fileOut = null; 8 9 //コピー元 10 try { 11 fileIn = new FileInputStream(pathFrom); 12 } catch (FileNotFoundException e) { 13 e.printStackTrace(); 14 return bl; 15 } 16 17 //コピー先 18 try { 19 fileOut = new FileOutputStream(pathTo); 20 } catch (FileNotFoundException e) { 21 e.printStackTrace(); 22 return bl; 23 } 24 25 // byte型の配列を宣言 26 byte[] buf = new byte[256]; 27 int len; 28 29 // ファイルの終わりまで読み込む 30 try { 31 while((len = fileIn.read(buf)) != -1){ 32 try { 33 fileOut.write(buf,0,len); 34 } catch (IOException e) { 35 e.printStackTrace(); 36 return bl; 37 } 38 } 39 } catch (IOException e) { 40 e.printStackTrace(); 41 return bl; 42 } 43 44 //ファイルに内容を書き込む 45 try { 46 fileOut.flush(); 47 } catch (IOException e) { 48 e.printStackTrace(); 49 return bl; 50 } 51 52 //ファイルの終了処理 53 try { 54 fileOut.close(); 55 } catch (IOException e) { 56 e.printStackTrace(); 57 return bl; 58 } 59 try { 60 fileIn.close(); 61 } catch (IOException e) { 62 e.printStackTrace(); 63 return bl; 64 } 65 66 return true; 67 }

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

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

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

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

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

swordone

2017/10/30 16:37

コピー先のファイルがコピー前に存在している必要があるのはいいのでしょうか…。
guest

回答2

0

ご質問のプログラムについていえばtry/catch(詳しく言うとtry-with-resource)は必須と思います。なぜなら資源の解放が必要だからです。throws句をおいたとすると

Java

1// メソッド名をキャメルケースに変更 2private void copyPaste(String pathFrom, String pathTo) throws IOException { 3 try (FileInputStream fileIn = new FileInputStream(...); 4 FileOutputStream fileOut = new FileOutputStream(...)) { 5 ...なにかする... 6 } // catch/finallyなどでcloseを一々書く必要はない。tryから抜けるときに自動的にcloseされる 7}

投稿2017/10/29 06:46

KSwordOfHaste

総合スコア18394

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

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

KSwordOfHaste

2017/10/29 06:57

maisumakunさんがtry/catchの複雑さの軽減について回答されてますので、参考にしただきたいと思います。ただtry-catchを完全に省略するとファイルのクローズ漏れ(資源解放漏れ)となるため、その点のみtry-with-resourceが必要であることに留意していただきたいと思いました。
uer03108

2017/10/31 03:56

有難うございました。 返事が遅れまして申し訳ありません。 リソースを解放することが目的であれば、tryのみの記述で良いという意味でしょうか。 細かな点ですが重要ですね。 大量のファイルを呼び出す場合や、定期的にファイル呼び出しを行う場合でも処理落ちしにくい設計ということでしょうか。
KSwordOfHaste

2017/10/31 04:56

> リソースを解放することが目的であれば、tryのみの記述で良いという意味でしょうか。 そうですね。catch/finallyを必要とするのはアプリケーション固有のなんらかの後処理をしたい場合と考えた方がよい気がします。 一方AutoClosableなオブジェクト(java.io.*の多くのクラスがそうです)の資源漏れを確実に排除するにはtry-with-resourceが常とう手段だと思います。というかtry-with-resource意外の方法でcloseするのはNGと言われるレベルかも知れません。というのは、catch/finallyでcloseを保証するコードは第三者(あるいは自分)が見たときにバグがないかどうかすぐには把握しづらいからです。 > 細かな点ですが重要ですね。 重要であることは同意します。ただ、個人的な意見としては「細かな点」とは考えない方がよいと思っています。 > 大量のファイルを呼び出す場合や、定期的にファイル呼び出しを行う場合でも処理落ちしにくい設計 たとえ1つしかファイルを処理しないようなアプリケーションでも普段からtry-with-resourceを使うことは大切だと思います。そういう習慣をつけておかないといざ「長期間安定して動作するアプリケーションを作ろう」としても、きちんと配慮した設計をやりそこねてしまう危険が高くなるでしょうから。
guest

0

ベストアンサー

元のメソッドがthrows IOExceptionとなっている以上は、内部で後始末が必要でもなければtry-catchをせず、呼んだ側に処理を任せるのが正解と考えます(なお、FileNotFoundExceptionIOExceptionのサブクラスなので、別途宣言する必要はありません)。

throws IOExceptionを外して「失敗すればfalseを返す」メソッドとして実装したい場合も、例外の起きた場所によって挙動を変えるのでなければ、まとめてtry-catchでかまいません。

java

1private boolean someMethod() 2{ 3 try{ 4 // 本筋の処理 5 }catch (IOException e) { 6 e.printStackTrace(); 7 return false; 8 } 9}

投稿2017/10/29 05:45

maisumakun

総合スコア145184

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

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

uer03108

2017/10/31 03:45

>まとめてtry-catchでかまいません。 勉強になりましたm(_ _)m まとめて書けるのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問