teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

サンプルコードを記述

2018/05/27 13:15

投稿

退会済みユーザー
answer CHANGED
@@ -1,4 +1,46 @@
1
- try-resourceを使え
1
+ try-with-resource を使え
2
2
  reader.closeでヌルポ
3
3
  例外メッセはわかるが発生箇所がわからん(例外オブジェを渡してスタック表示できん?)
4
- ログレベルがシステム停止を指すと思われるのに処理が続行されている
4
+ ログレベルがシステム停止を指すと思われるのに処理が続行されている
5
+
6
+ # 詳細化(第一弾)
7
+
8
+ ```java
9
+ BufferedReader reader = null;
10
+ try {
11
+ reader = new BufferedReader(new FileReader(file));
12
+ String line;
13
+ while ((line = reader.readLine()) != null) {
14
+ // ...
15
+ }
16
+ } catch (IOException e) {
17
+ // exit を行わないので warn レベル以下とすべきである
18
+ // 例外情報は ログフォーマットにて制御させるため渡す必要あり
19
+ // ここ以外は多分許容されただけだと思われる。
20
+ // また ログレベルに関しては適切なものを選んでください。
21
+ log(Level.WARNING, e.getMessage(), e);
22
+ } finally {
23
+ try {
24
+ // NullPointerException は発生しても握りつぶすのではなく
25
+ // 発生しないように対策をする。(例外コスト削減)
26
+ if (reader != null) reader.close();
27
+ } catch (IOException e) { // 無視する例外は IOException だけと明示する
28
+ // nop // 処理を入れてないことを明示する
29
+ }
30
+ }
31
+ ```
32
+ あたりになるでしょう。
33
+ また [try-with-resource ] をりようすると
34
+
35
+ ```java
36
+ try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
37
+ String line;
38
+ while ((line = reader.readLine()) != null) {
39
+ // ...
40
+ }
41
+ } catch (IOException e) {
42
+ log(Level.WARNING, e.getMessage(), e);
43
+ }
44
+ ```
45
+
46
+ で上記コードとほぼ同一になります。