1

ファイル内のテキスト行を逆にするプログラムを作成しようとしています。私はまだJavaを学んでおり、これは初めてです。ループ内で変数を作成し、外部でアクセスしようとしたため、プログラムでエラーが発生しました。文字列変数を宣言する前に接頭辞「public」を追加しようとしましたが、コンパイルしようとすると「public」を指し、不正な式の開始と表示されます。なぜこれがエラーになるのか、またはそれを修正する方法を教えてください。

    import java.io.*;
    import java.util.*;

    public class FileReverser
    {
     public static void main(String[] args)
     throws FileNotFoundException
{
    Scanner console = new Scanner(System.in);
    System.out.print("File to Reverse: ");
    String inputFileName = console.next();

    System.out.print("Output File: ");
    String outputFileName = console.next();

    FileReader reader = new FileReader(inputFileName);
    Scanner in = new Scanner(reader);
    PrintWriter out = new PrintWriter(outputFileName);

    int number = 0;

    while (in.hasNextLine())
    {
        String line = in.nextLine();
        public String[] lines;
        lines[number] = line;
        number++;
    }
    int subtract = 0;
    for (int i;i>lines.length;i++)
    {
        out.println(lines[(lines.length-subtract)]);
        subtract++;
    }

    out.close();

    }
    }
4

3 に答える 3

3

問題:

  • ローカル変数ではなく、インスタンス/静的変数専用の修飾子で宣言linesしています。public
  • あなたは決して初期化していません lines
  • その範囲外で使用しようとしてlinesいます(現在はwhileループです)
  • ここで、初期化せずに使用しようとしていiます:

    for (int i;i>lines.length;i++)
    
  • あなたのif状態は逆です。次の値より小さいiは続行しますlines.length
  • subtract最初は 0 であるため、アクセスするlines[lines.length - subtract]と例外がスローされます (配列の境界外であるため)。

これらは次のコードで修正できます。

// See note later
String[] lines = new String[1000];

while (in.hasNextLine()) {
    String line = in.nextLine();
    lines[number] = line;
    number++;
}
// Get rid of subtract entirely... and only start off at "number"
// rather than lines.length, as there'll be a bunch of null elements
for (int i = number - 1; i >= 0; i--) {
    out.println(lines[i]);
}

これで最大 1000 行まで動作しますが、その制限があるのは苦痛です。を使用するだけの方が良いでしょうList<String>

List<String> lines = new ArrayList<String>();
while (in.hasNextLine()) {
    lines.add(in.nextLine());
}

次に、 の代わりに を使用し、配列インデクサーの代わりに を使用して値にアクセスする必要がありますsize()lengthgetIMO のコードはよりクリーンになります。

于 2013-10-06T15:34:25.920 に答える
0

これはスコープの問題です。lineswhile ループの外で宣言する必要があります。while ループを入れることlinesで、そのループ内でのみ利用可能になります。外部に移動すると、スコープはlinesmain メソッド内になります。

変数のスコープは、変数にアクセスできるプログラムの部分です。

これは、バークレーのクラスでの変数とスコープに関する講義ノートです。時間があれば、読んでみてください。 http://www.cs.berkeley.edu/~jrs/4/lec/08

于 2013-10-06T15:34:03.513 に答える