我正在用一个开关创建一个简单的菜单驱动程序(我以前做过) 声明。我已经声明了全局变量 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');
答案 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)
在第一种情况下,您没有收到警告,因为您没有尝试使用该变量中的值,而是实际上正在初始化它。在第二种情况下,您尝试使用它并且尚未初始化,因此警告。