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

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

ただいまの
回答率

88.03%

ファイルを読み込む(JAVA)

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,626

score 66

Javaを始めたばかりです。「ファイルから読み込んでみよう」のチャプタにてバグが起こってしまいました。
なぜ起こっているのかわからず止まってしまっています。

あいまいな質問となってしまいましたが、よろしくお願いいたします。

また、このコードが載っている教科書に「AutoCloseableインターフェイスを実装しています。」という記述があるのが何かヒントなのかもしれないと思っていますが、自分では解決できません。


イメージ説明
イメージ説明

<テキストコード>

package chapter08;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Main3 {
    private static final String LINE_SEPARATOR = System.lineSeparator();
    
    public static void main(String[] args) {
        System.out.println(readFromFile("src/capter08/Main3.java"));
    }
    
    public static String readFromFile(String fileName) {
        File file = new File(fileName);
        StringBuilder sb = new StringBuilder();
        
        FileReader fr = null;
        BufferedReader br = null;
        try {
            fr = new FileReader(file);
            br = new BufferedReader(fr);
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line).append(LINE_SEPARATOR);
            }
            return sb.toString();
        } catch (FileNotFoundException e) {
            System.err.println(String.format("ファイルが見つかりません: %s", fileName));
            return null;
        } catch (IOException e) {
            System.err.println(String.format("ファイル読み込みに失敗しました: %s", fileName));
            return null;
        } finally {
            closeSilently(br);
            closeSilently(fr);
        }
    }
    
    private static void closeSilently(AutoCloseable target) {
        if (target != null) {
            try {
                target.close();
            } catch (Exception e) {}
        }
    }

}


みなさんの改善提案に沿ってググって実行してみたのですが、バージョンを7にして適用を押しました。するとエラーが消えないのですが他に作業が必要なのでしょうか?

イメージ説明
イメージ説明
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • argius

    2015/08/30 02:22

    コードは、画像だけだとコピーして確認することが困難になりますので、テキスト「も」貼ってください。

    キャンセル

  • Takahito

    2015/08/30 02:24

    ご指摘ありがとうございます。そのようにします。

    キャンセル

回答 2

checkベストアンサー

+3

Main3.javaが含まれているEclipseのプロジェクトのJavaのバージョンがJava6になっているようです。

AutoClosableSystem.lineSeparator()は、Java7から使えるようになったAPIですので、Java7以降を使うように設定してみてください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/08/30 11:12

    以下、最初のコメントへの返答になります。

    タイミングや内容の難易度によってはすぐに回答が得られないこともありますが、少なくともteratailにおいては、よほど変な質問(課題の丸投げだったり)でなければ心配ないですよ。


    あと、swordoneさんも書かれていますが、教科書には、開発環境の前提条件などが冒頭に書かれていることが多いですので、確認してみてください。


    原因が分かった理由:
    とりあえず、現在の最新バージョン(Java8)でMain3.javaをコンパイルしてみたら、エラーにならなかったので、貼っていただいた画像をよく見てみたら、System.lineSeparatorでエラーが出ているようでした。
    それと「AutoCloseableインターフェイス」というキーワードが出ていたので、Java7関連であるとピンときました。
    画像のコンソールのところに、"1.6.0.jdk"というパスの文字列が見えたので、Java6で作っているのかな、と思いました。
    ということで、もっとじっくり画像を見ていれば今回のは画像だけで解決できていたのですが...


    次回は、開発している環境(OSXとEclipse)と、どんなコンパイルエラーメッセージが出ているかも書いていただければ、もっと早く回答が(回答者様方に)もらえると思いますよ。

    キャンセル

  • 2015/08/30 11:36 編集

    私からも補足を.
    赤線はコンパイルエラーを表しています(マウスオーバーすれば原因が表示されます).
    今回メソッド名lineSeparatorに赤線が出ており,この場合の原因として主に考えられるのは「引数が間違っている」か「メソッドが存在しない」のいずれかです.
    しかし今回本のコードを書き写しているようなので,コードミスによってこれらが起きているとは考えにくいです.
    そこで,Systemクラスのドキュメントを調べます.検索をかければこのようなドキュメントが見つかります→http://docs.oracle.com/javase/jp/8/api/java/lang/System.html
    このlineSeparatorを見てみると,「導入されたバージョン: 1.7」となっています.
    つまり1.7(Java7)よりも前のJavaではそもそもこのメソッドが存在しないので参照できないというわけです.
    ちなみに,AutoCloseableインタフェース(https://docs.oracle.com/javase/jp/8/api/java/lang/AutoCloseable.html)も,このドキュメントで1.7で導入されたとわかります.

    キャンセル

  • 2015/08/30 17:55

    お2人ともありがとうございます。コンソールのところのパスの文字列の確認というのも後から見返すとヒントになっていたのですね。
    また、考え方について教えていただきありがとうございました。
    本当にありがとうございました。
    感謝ばかりになってしまいましたが、心から感謝の気持ちを伝えたいです。

    キャンセル

+1

お使いのJavaのバージョンを確認してください.
そのコードから推測するに,お使いの本はJava7以上を想定しています.

で,実はこのコード,と言うかプロジェクトにまだ問題があります.
結論を先に言うと,同じパッケージ内にある自作のAutoCloseableを削除してください.

この中のcloseSilentlyメソッドを使ってる2箇所と,closeSilentlyの中のcloseメソッドに赤線が出てますね?
この原因が,プロジェクト内で作っているAutoCloseableにあります.
教科書に書いている「AutoCloseableを実装している」というのは,
ここで使っているFileReaderやBufferedReaderがjava.lang.AutoCloseableを実装しているということです.
自分でAutoCloseableをパッケージchapter08に作成したことによって,
closeSilentlyメソッドの仮パラメータであるAutoCloseableが
chapter08.AutoCloseableを指してしまっています
java.lang.AutoCloseableとchapter08.AutoCloseableには関係がないので引数として渡せませんし,
おそらくchapter08.AutoCloseableにcloseメソッドがないため,引数に対してcloseメソッドを実行することもできません.
なのでこの自作のAutoCloseableを削除してください.

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/08/30 02:44

    ありがとうございます。

    キャンセル

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

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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