(Java)Switch语句中的全局变量问题

时间:2016-03-20 00:29:46

标签: java variables switch-statement

我正在用一个开关创建一个简单的菜单驱动程序(我以前做过) 声明。我已经声明了全局变量 cuser ,它适用于第一个 开关中的情况。但是,如果我在其他情况下使用它,则认为 cuser 尚未初始化。使用其他变量引用 cuser 也不起作用。它看起来应该有效,但我无法弄清楚为什么它不会。

    String cuser; //Current user of e-mail system
    String recip; //Recipient of message

    char choice; //User input 

    do
    {
        choice = menuScan.next().charAt(0);

        do
        {   
            switch(choice)
            {
                case 'I':
                case 'i':
                    System.out.println("Username: ");
                    cuser = menuScan.next();
                    System.out.println("Logged in.");
                    break;

                case 'S':
                case 's':
                    System.out.println("Recipient: ");
                    recip = menuScan.next();

                    m = new Message(cuser,recip);
                    System.out.println("Enter message. Blank line to quit: ");
                    m.append(menuScan.nextLine());  

                    ms.deliver(m);
                    break;

                case 'R':
                case 'r':
                    ms.printMessages(cuser);
                    break;

                case 'O':
                case 'o':
                    System.out.println("Logged out.");
                    break;

                //No 'Q' case; serves no purpose other than termination

                default:
                    System.out.println("Invalid selection.");
                    break;
            }   
        }
        while(choice != 'O' && choice != 'o');
    }
    while(choice != 'Q' && choice !='q');

3 个答案:

答案 0 :(得分:1)

String cuser;更改为String cuser = null; String cuser = "";

Java编译器检测到cuser可能 1 在您的第一个switch之后尚未初始化。

1 可能是,也可能不是。编译器不是有感知的,它无法确定所有可能的代码路径。

答案 1 :(得分:0)

如果您的计划的第一个输入是s会怎样?如果没有首先执行cuser的作业,它会引用cuser!编译器不允许你这样做,因为局部变量在被分配之前(逻辑上)是空的。换句话说,编译器是正确的:有一些代码路径到达cuser的引用,而不首先完成对cuser的赋值。

幸运的是,修复非常简单:确保在尝试阅读之前已写入cuser!最简单的方法可能是在声明时初始化cuser。您可以在程序逻辑中编写任何有意义的值;你只需要在编译器允许你从中读取一个值之前给它写一些值。例如:

String cuser=null;

会工作得很好。完成后,将没有代码路径从cuser读取而不首先写入它,因为您首先写入cuser!同样,任何保证每次读取的修复都会在一些写操作之前正常工作;初始化只是一种解决方案,恰好是最简单的。

答案 2 :(得分:0)

在第一种情况下,您没有收到警告,因为您没有尝试使用该变量中的值,而是实际上正在初始化它。在第二种情况下,您尝试使用它并且尚未初始化,因此警告。