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

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

ただいまの
回答率

90.52%

  • Java

    15527questions

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

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

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,651

nob777

score 103

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

イメージ説明

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2017/01/14 12:54

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

    キャンセル

  • nob777

    2017/01/14 17:44

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

    キャンセル

  • nob777

    2017/01/14 19:40

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

    キャンセル

回答 3

-2

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

TYPE TRY BLOCK READER FINALLY
1 ER - NU OK
2 ER - NU ER
3 ER - NN OK
4 ER - NN ER
5 OK - NU OK
6 OK - NU ER
7 OK - NN OK
8 OK - NN ER

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

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

ですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/14 20:24

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

    キャンセル

  • 2017/01/14 20:40

    追記しました。

    キャンセル

  • 2017/01/14 20:44

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

    キャンセル

  • 2017/01/14 22:54

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

    キャンセル

-2

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

final FileReader fr = new FileReader(file);
Throwable #primaryExc = null;

try {
  ;
} catch (Throwable #t) {
  // (1c)
  #primaryExc = #t;
  throw #t;
} finally {
  if (fr != null) {
    // (2a)
    if (#primaryExc != null) {
      // (3a)
      try {
        fr.close();
      } catch (Throwable #suppressedExc) {
        // (4c)
        #primaryExc.addSuppressed(#suppressedExc);
      }
    } else {
      // (3b)
      fr.close();
    }
  } else {
    // (2b)
  ]
}

便宜上、通過行にコメント(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 22:51

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

    キャンセル

  • 2017/01/14 23:09

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

    キャンセル

  • 2017/01/14 23:20

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

    キャンセル

-6

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/14 20:12

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

    キャンセル

  • 2017/01/14 20:17

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

    キャンセル

  • 2017/01/14 22:56

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

    キャンセル

同じタグがついた質問を見る

  • Java

    15527questions

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