【问题标题】:Java cannot find symbol during compilingJava在编译期间找不到符号
【发布时间】:2014-05-04 12:43:07
【问题描述】:

我有一个问题。我写了一个程序,它可以让我数到一个特定的数字,并且能够使用前缀和后缀。我需要这个来构建另一个程序。 这是我的代码(//offen 是德语,表示打开,//zu 表示关闭)

public class zael{ //offen1
    public static void main(String[] args){//offen2
        int z = 0;
        System.out.println("Bis welche Zahl willst du zaelen?");
        String keins = System.console().readLine();
        int k = Integer.parseInt(keins);
        System.out.println("Willst du einen prefix? (Y/N)");
        String p = System.console().readLine();
        if (p.equals ("Y")){//offen3
            System.out.println("Gib deinen Prefix an!");
            String pref = System.console().readLine();
        }//zu3
        System.out.println("Willst du einen Suffix? (Y/N)");
        String s = System.console().readLine();
        if (s.equals ("Y")) {//offen4
            System.out.println("Gib deinen Suffix an!");
            String suff = System.console().readLine();
        }//zu4
        if (p.equals ("Y")){//offen5
            while(z < k) {//offen6
                if (s.equals ("Y")) {//offen7
                    System.out.println(pref);
                    System.out.print(z+1);
                    System.out.print(suff);
                    z = z + 1;
                }//zu7
                else {//offen8
                    System.out.println(pref);
                    System.out.print(z+1);
                    z = z + 1;
                }//zu8
            }//zu6
        }//zu5
        else {//offen9
            while (z < k){//offen10
                if (s.equals ("Y")) {//offen11
                    System.out.println("Gib deinen Suffix an!");
                    String suff = System.console().readLine();
                    System.out.println(z+1 + suff);
                    z = z + 1;
                }//zu11
                else{//offen12
                    System.out.println(z+1);
                    z = z + 1;
                }//zu12
            }//zu10
        }//zu9
    }//zu2
}//zu1

我得到的错误是:

zael.java:22: error: cannot find symbol
                    System.out.println(pref);
                                       ^
  symbol:   variable pref
  location: class zael
zael.java:24: error: cannot find symbol
                    System.out.print(suff);
                                     ^
  symbol:   variable suff
  location: class zael
zael.java:28: error: cannot find symbol
                    System.out.println(pref);
                                       ^
  symbol:   variable pref
  location: class zael
3 errors

【问题讨论】:

  • 你能缩进你的代码吗?读起来真的很痛苦。
  • 算上你的{}if(#{ != #}) error();.
  • 我用 //offen 和 //zu 计算了它们
  • 那些 //offen 和 //zu cmets 很奇怪。如果您使用合适的 IDE,则不需要。

标签: java string counter


【解决方案1】:

问题是这一行: System.out.println(pref);

您尚未在此范围内定义 prefpref 字段仅在 main 方法中定义,但不能在其外部读取,因此在您的 main 方法之外,pref 字段也必须定义。 (您也可以将其定义为静态成员字段以减少代码重复。)

【讨论】:

  • 但是如果我在“if”之外定义它,它会被每次询问,而不仅仅是当用户说 Y
  • @Taxcamp 您必须在可见的范围内定义变量,没有什么可以强迫您询问用户它应该是什么。
  • 你想定义一个默认值(pref 和 suff 的后备值。它们都是空字符串并且在你的类中可见。然后你问用户他是否喜欢有前缀/后缀,以防万一'Ja, bitte' 在任何一种情况下,您都会覆盖这些空白字段的 pref/suff。这样,您的用例保持不变并且您的代码可以编译。现在有问题了:如果您在 if-scope 中定义字段,则该字段是一直保持到确切的 this if 范围并在那里丢弃(那里有注释'//zuX')。但是你希望 pref/suff 在你的整个班级中都是可见的。
  • 您不必在 if 块之外分配它。您可以简单地在外部定义它,以便变量的范围变大。
  • ……不是在外面……而是在外面? ...范围更大...我不明白。我想我们的想法是一样的。
【解决方案2】:

如果你缩进你的代码很容易看到:

    if (p.equals("Y")) {//offen3
        System.out.println("Gib deinen Prefix an!");
        String pref = System.console().readLine();
    }//zu3

在上面的代码块中,变量 pref 变得无用,因为一旦块关闭,它的范围就结束了。

    if (s.equals("Y")) {//offen4
        System.out.println("Gib deinen Suffix an!");
        String suff = System.console().readLine();
    }//zu4

上面的变量suff也是如此。

因此您会在以下几行中遇到错误:

System.out.println(pref);
System.out.print(z + 1);
System.out.print(suff);

解决此问题的最简单方法是在 if 块之外定义两个变量,如下所示:

String pref = null;
if (p.equals("Y")) {//offen3
    System.out.println("Gib deinen Prefix an!");
    pref = System.console().readLine();
}//zu3

【讨论】:

    【解决方案3】:

    这与变量的范围有关:

    来自 Java 语言规范Section 6.3

    声明的范围是程序的区域,在该区域内,声明所声明的实体可以使用简单名称来引用,前提是它是可见的。

    当且仅当声明的范围包括该点时,才称声明在程序中的特定点在范围内

    那么,分析你的程序...

    1. 名为prefString 变量在范围#3 中声明。因此它可以被它自己和嵌套在其中的其他作用域访问。
    2. 当您尝试在第 22 行和第 28 行访问范围 #4 中的 pref 变量时。
    3. 变量suff也是如此。

    现在,如何修复它?

    声明(并初始化)变量你需要它们的范围之外。例如,您需要作用域#4 中的pref 变量。因此,在main() 方法中声明它,即范围#2。

    然后将您的 if (p.equals ("Y")){... 语句修改为:

    if (s.equals ("Y")) {//offen4
        System.out.println("Gib deinen Suffix an!");
        suff = System.console().readLine();
    } else {
        // some backup mechanism like System.exit(0);
        // so that it doesn't pose a problem later.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 2019-05-31
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多