非法启动表达式字符串

时间:2013-10-06 15:30:48

标签: java

我正在尝试制作一个反转文件中文本行的程序。我还在学习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();

    }
    }

3 个答案:

答案 0 :(得分: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()而不是length,并使用get代替数组索引器来访问值 - 但它将是更清晰的代码IMO。

答案 1 :(得分:0)

这是一个范围问题。 lines应该在while循环之外声明。通过将lines置于while循环中,它仅在该循环内可用。如果将其移到外面,lines的范围将在主方法中。

变量的范围是可以访问变量的程序部分。

以下是伯克利课程中关于变量和范围的讲义。如果你有时间,请给它一个阅读。 http://www.cs.berkeley.edu/~jrs/4/lec/08

答案 2 :(得分:0)

访问修饰符(publicprivateprotected)仅适用于类成员(方法或字段)。

如果要访问受{}限制的范围之外的变量,这意味着您在错误的范围内定义了变量。例如,如果你在里面定义了循环和变量x,然后想在循环之外使用它:

for (int i = 0; i < 10; i++) {
    .....
    int x = 6;
    .....
}

int y = x; // compilation error

...你真的想在循环之前定义这个变量:

int x = 0;
for (int i = 0; i < 10; i++) {
    .....
    x = 6;
    .....
}

int y = x; // not variable is available here