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

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

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

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

Q&A

解決済

2回答

2694閲覧

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

Takahito

総合スコア66

Java

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

0グッド

0クリップ

投稿2015/08/29 17:20

編集2015/08/29 17:48

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にして適用を押しました。するとエラーが消えないのですが他に作業が必要なのでしょうか?

イメージ説明

イメージ説明

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

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

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

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

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

argius

2015/08/29 17:22

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

2015/08/29 17:24

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

回答2

0

ベストアンサー

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

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

投稿2015/08/29 17:30

編集2015/08/29 18:02
argius

総合スコア9388

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

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

Takahito

2015/08/29 17:34

ありがとうございます。 そのようなことが原因だったのですね。 恥ずかしながら、バージョンなど意識せずに使っていたのでこのご指摘は非常にありがたいです。このようなサイトに投稿するのは初めてでしたが、チャレンジしてみて良かったです。 ちなみに、すぐにその原因がわかった理由や方法などはあるのですか? もしよろしければ教えていただきたいです。経験などでしたら、すぐに自分もみにつけることは難しいかもしれませんが。。。
argius

2015/08/29 17:58 編集

自動で再ビルドする設定になっていますか? それが分からなければ、エラーの出ているファイルを再保存してみるとコンパイルされると思います。 システムライブラリーもJava1.7に変更してください。
Takahito

2015/08/29 18:00

再ビルドの設定はわからなかったのですが、ファイルの再保存は何度やっても解決しません。
argius

2015/08/29 18:01

コンパイルのバージョンだけが変わっているようですので、システムライブラリーのバージョンもJava1.7に変えてみてください。
Takahito

2015/08/29 18:28

うまくできないのでまた、明日チャレンジしてみます。
argius

2015/08/29 18:33

分かりました。 さっき気づいたのですが、もしかしてJava7をインストールしていないのかなと思いました。 コンパイルはEclipse側だけでバージョンを1.7に変えることはできますが、システムライブラリーはJDKかJREを入れていないとダメなので。
Takahito

2015/08/29 18:41

どうやら、そのようでインストールからやってみているのですがインストール後のEclipseでの設定がインストール先がみつからずうまくできなくて手こずってしまっています。パソコン音痴でだめですね。。
argius

2015/08/29 18:42

あせらずにゆっくりやりましょう。 分からないことがあったらまたコメントしてください。
Takahito

2015/08/29 18:45 編集

ありがとうございます。原因はわかったと思うのでベストアンサーとさせていただきます。
argius

2015/08/30 02:12

以下、最初のコメントへの返答になります。 タイミングや内容の難易度によってはすぐに回答が得られないこともありますが、少なくともteratailにおいては、よほど変な質問(課題の丸投げだったり)でなければ心配ないですよ。 あと、swordoneさんも書かれていますが、教科書には、開発環境の前提条件などが冒頭に書かれていることが多いですので、確認してみてください。 原因が分かった理由: とりあえず、現在の最新バージョン(Java8)でMain3.javaをコンパイルしてみたら、エラーにならなかったので、貼っていただいた画像をよく見てみたら、System.lineSeparatorでエラーが出ているようでした。 それと「AutoCloseableインターフェイス」というキーワードが出ていたので、Java7関連であるとピンときました。 画像のコンソールのところに、"1.6.0.jdk"というパスの文字列が見えたので、Java6で作っているのかな、と思いました。 ということで、もっとじっくり画像を見ていれば今回のは画像だけで解決できていたのですが... 次回は、開発している環境(OSXとEclipse)と、どんなコンパイルエラーメッセージが出ているかも書いていただければ、もっと早く回答が(回答者様方に)もらえると思いますよ。
swordone

2015/08/30 02:43 編集

私からも補足を. 赤線はコンパイルエラーを表しています(マウスオーバーすれば原因が表示されます). 今回メソッド名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で導入されたとわかります.
Takahito

2015/08/30 08:55

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

0

お使いの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/29 17:38

編集2015/08/29 22:41
swordone

総合スコア20651

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

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

Takahito

2015/08/29 17:44

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問