【问题标题】:Cannot find symbol for previously named variable找不到以前命名的变量的符号
【发布时间】:2015-05-16 16:26:27
【问题描述】:
import java.util.Scanner;

public class V1_1 {
    public static void main(String[] args) {
        Scanner UIS = new Scanner(System.in);
        System.out.print("Hello!");
        System.out.println("    What is my name?");
        String MyName = UIS.nextLine();
        while(true){
            String a1 = UIS.nextLine();
            execute(a1);
        }
    }
    public static void execute(String a1) {
        Scanner UIS = new Scanner(System.in);
        switch(a1) {
            case "Hello":
                System.out.println("    Hello!");
                break;
            case "What is your name?":
                System.out.println("My name is " + MyName + )
            case "SHUTDOWN":
                System.out.print("  Goodbye...");
                System.exit(0);
                break;
            default :
                System.out.println("    I don't understand...");
        }
    }
}

当我尝试编译此代码时,我收到一条错误消息,指出它找不到符号 MyName,即使它以前被命名。我对java非常陌生(昨晚),所以任何帮助都会很棒。谢谢!

【问题讨论】:

  • 阅读声明范围
  • 您将 a1 作为参数传递给执行,但您还需要传递 MyName。
  • 好的,我现在明白了。我在任何地方都找不到如何执行多个变量,例如 MyName 和 a1 。

标签: java find symbols


【解决方案1】:

欢迎来到 SO!

首先,代码并没有达到应有的水平。就个人而言,我会将所有案例拆分为他们自己的方法。

其次,你应该为这个类选择一个更好的名字,最好是一个名词,你不应该让所有的方法都是静态的。在大多数情况下应避免使用 static 关键字。

出于以下代码的目的,我将假设该类称为 Thingy(请随意使用更好的名称进行编辑)。

要使用非静态方法,您必须首先使用 sn -p Thingy thing = new Thingy(); 创建一个 Thingy 对象

那个 sn-p 创建了一个名为thingy 的Thingy 引用变量,并将其初始化为一个Thingy 对象的新实例。

这样,您将能够通过在方法外部插入String MyName; 来声明实例变量,并且能够在所有非静态方法中访问它。

要在 main 中访问它,在声明了 Thingy 对象后,使用 thing.MyName 访问引用变量 IN MAIN,例如thing.MyName = UIS.nextLine();

在非静态方法中,所有实例变量都可以像局部变量一样被访问,例如MyName = "Chris";

对于比我更好的人的建议,请阅读官方教程。

http://docs.oracle.com/javase/tutorial/

【讨论】:

    【解决方案2】:

    在你有的确切情况下......为了使 MyName 局部变量可以同时被两种方法访问,你可以封装它或将 MyName 声明为一个字段;

    声明为字段示例:

    private static String MyName;//do declare as a field
    public class V1_1 {
        public static void main(String[] args) {
            Scanner UIS = new Scanner(System.in);
            System.out.print("Hello!");
            System.out.println("    What is my name?");
            MyName = UIS.nextLine();//<--do not declare but init only
            while(true){
                String a1 = UIS.nextLine();
                execute(a1);
            }
        }
        public static void execute(String a1) {
            Scanner UIS = new Scanner(System.in);
            switch(a1) {
                case "Hello":
                    System.out.println("    Hello!");
                    break;
                case "What is your name?":
                    System.out.println("My name is " + MyName + )
                case "SHUTDOWN":
                    System.out.print("  Goodbye...");
                    System.exit(0);
                    break;
                default :
                    System.out.println("    I don't understand...");
            }
        }
    }
    

    附言我将字段 MyName 声明为 static 导致“无法从静态上下文引用非静态变量”

    无论如何请仔细阅读教程:)


    如果你有更多的细节,请发表评论

    祝你好运:)

    【讨论】:

    • 这很有效,您的解释帮助很大。谢谢你。我会更深入地研究更多教程。
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2015-09-14
    • 2016-07-01
    • 2016-03-27
    • 2010-10-12
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多