teratail の「ヘルプ」の「質問するときのヒント」を読むと、
「3-4. 発生している問題・エラーメッセージを書きましょう」と書いてあります。
エラーメッセージから、ソースのどこが悪いのかが分かります。
String name += n;
ここです。
変数 name を宣言するんだったら、String name:
または、初期化を含めて、String name = "";
です。
name に n を連結するなら、name += n;
です。
String name = "";
を for文の前に置いて、
for文の中は name += n;
だけにしてみてください。
キーボードから
text
1aaaaa
2bbbbb
3ccccc
4ddddd
5eeeee
と入力すると、aaaaabbbbbcccccdddddeeeee と表示されます。
ところが、入力をファイルに切り替えると、そのような表示もされません。
それは、Scanner の使い方を間違っているからです。
追記
一つの入力である System.in に対して、ループの中で
Scanner を何度も new するのはよくありません。
Scanner を new すると、生成された Scannerオブジェクトは
それぞれが 8KB 程度のバッファを保持します。
標準入力の System.in がキーボードなら、入力は行単位なので、
各Scannerオブジェクトのバッファに 1行ずつ入るだけで、
思い通りの処理がされますが、
javac Keisan <data.txt
のように標準入力をファイルに切り替えると、最初の Scannerオブジェクトが
自分の持っているバッファ一杯にファイルの内容を読み込んでしまいます。
nextLine で 1行取得しますが、残りの 4行はバッファ内に残ります。
2番目の Scannerオブジェクトが続きを読もうと思っても、
もうファイルの終わりに達しているので読み込めません。
ということで、次のように Scanner の new は 1回だけにしましょう。
Java
1import java.util.Scanner;
2
3public class Keisan {
4 public static void main(String[] args) {
5 Scanner sc = new Scanner(System.in);
6 String name = "";
7 for(int i = 0; i < 5; i++)
8 name += sc.nextLine();
9 System.out.println(name + "です。");
10 }
11}
もちろん、入力が複数のファイルだとか、複数の文字列で、それに対して
Scannerオブジェクトを複数生成するのは構いません。