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

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

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

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

Q&A

3回答

6175閲覧

FileReaderをtry-with-resourcesで使用するとc1が8つある件について

nob777

総合スコア112

Java

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

0グッド

1クリップ

投稿2017/01/13 21:53

編集2022/01/12 10:55

javaのFileReaderをtry-with-resourcesで使用すると、以下のキャプチャのとおり、カバレッジc1で分岐が8つあるとのことです。

イメージ説明

■質問事項
・特に分岐が無いように見受けられますが、なぜ分岐が8つあるのでしょうか?
※null例外の他に内部で動作しているclose()等々の例外が分岐として数えられている?

・どのような分岐があるかを確認する方法はありますでしょうか?

■環境情報
・Eclipse 4.6.1
・Java 1.8
・Junit 4
・EclEmma 2.3.3

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

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

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

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

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

swordone

2017/01/14 03:54

FileReaderのコンストラクタに渡している変数fileの型は何でしょうか?
nob777

2017/01/14 08:44

ご確認いただきありがとうございます。変数fileの型はString型です。
nob777

2017/01/14 10:40

失礼しました。File型でした。右記コードのように取得しています。File file = new File(fname);
guest

回答3

0

Java8言語仕様(JLS8)に従うと、catch/finally節を持たないtry-with-resource構文は下記のように展開されます。(#で始まる変数名はJavaコンパイラ内部で自動生成される変数)

Java

1final FileReader fr = new FileReader(file); 2Throwable #primaryExc = null; 3 4try { 5 ; 6} catch (Throwable #t) { 7 // (1c) 8 #primaryExc = #t; 9 throw #t; 10} finally { 11 if (fr != null) { 12 // (2a) 13 if (#primaryExc != null) { 14 // (3a) 15 try { 16 fr.close(); 17 } catch (Throwable #suppressedExc) { 18 // (4c) 19 #primaryExc.addSuppressed(#suppressedExc); 20 } 21 } else { 22 // (3b) 23 fr.close(); 24 } 25 } else { 26 // (2b) 27 ] 28}

便宜上、通過行にコメント(1)〜(4)を付与すると実行パスは8パターン存在します。

  • (1c通過せず) → 2a → 3a → (4c通過せず)
  • (1c通過せず) → 2a → 3a → 4c
  • (1c通過せず) → 2a → 3b
  • (1c通過せず) → 2b
  • 1c → 2a → 3a → (4c通過せず)
  • 1c → 2a → 3a → 4c
  • 1c → 2a → 3b
  • 1c → 2b

投稿2017/01/14 02:05

yohhoy

総合スコア6189

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

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

nob777

2017/01/14 13:51

ご回答いただきありがとうございます。 1点確認させてください。 1cを通過せずに、3aを通過するケースとはどのようなケースでしょうか? ※#primaryExcはnullで初期化されているため、1cを通過しなければ3aを通過できないように見受けられます
nob777

2017/01/14 14:09

追加で確認させてください。 3bでfr.close()に対するtry~catchを行っていない理由について、ご存じでしたら教えていただけないでしょうか?
nob777

2017/01/14 14:20

教えていただいた上記8パターンを確認したところ、5パターンしか通せません。 もしかしたら矛盾と見受けられる以下が通過不可能なパターンなのかもしれません。  ・(1c通過せず) → 2a → 3a → (4c通過せず)  ・(1c通過せず) → 2a → 3a → 4c  ・1c → 2a → 3b   ※わたしの確認方法が悪い可能性も高いですが・・・
guest

0

以下のパターンかもしれません。

TYPETRYBLOCKREADERFINALLY
1ER-NUOK
2ER-NUER
3ER-NNOK
4ER-NNER
5OK-NUOK
6OK-NUER
7OK-NNOK
8OK-NNER

OK : OK
ER : ERROR
NU : NULL
NN : NOT NULL

java

1try (FileReader reader = new FileReader(file)) { // TRY 2 // BLOCK 3} finally { // FINALLY : このブロックは暗黙に作成される 4 if (reader != null) reader.close(); // READER 5}

ですね。

投稿2017/01/14 00:20

編集2017/01/14 11:39
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nob777

2017/01/14 11:24

ご回答いただきありがとうございます。 "TRY"とは何を指しているのでしょうか? ※"BLOCK"がtry-with-resoucesによるtry~catch~finallyの"try"を指しているように見受けられましたので、確認させてください。
退会済みユーザー

退会済みユーザー

2017/01/14 11:40

追記しました。
退会済みユーザー

退会済みユーザー

2017/01/14 11:44

ちなみにコードカバレッジ計測ソフトは結構頭が悪いのでデットコードがあってもそこが実行されないよとでる.
nob777

2017/01/14 13:54

追記いただきありがとうございます。 カバレッジツールへの過信も禁物である旨、承知しました。
guest

0

FileReader()の()の中身は
①読込み元のFile
②読込み元のFileDescriptor
③読込み元のファイルの名前
の三種類の値が取れるようです
これらのファイル三種類について「ファイルを開け、close()もできた」3種類と
「ファイルを開け、close()はできなかった」3種類と
「Fileがnullだった」1種類
「ファイルの名前がnullだった」1種類
で8種類
ではないでしょうか?
FileDescriptorはFileReader()に入れた時
FileNotFoundExceptionを投げないようなので
nullにはならないのではないかと思います

投稿2017/01/13 23:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nob777

2017/01/14 11:12

ご回答いただきありがとうございます。 上記8種類の場合、try-with-resoucesによるtry~catch~finallyのtryとcatch部分を通過するルートは含まれないことになりませんでしょうか?
退会済みユーザー

退会済みユーザー

2017/01/14 11:17

上に書いたのは単なる類推です 恐らくはyohhoyさんの考えの方が正解なのだと思います
nob777

2017/01/14 13:56

ご回答ありがとうございます。 カバレッジ側でもどのような8分岐があるかという詳細を確認する方法があるといいですよね・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問