Java编译器如何处理以下交换机块? 'b'变量的范围是什么?
请注意,'b'变量仅在switch语句的第一个分支中声明。试图在第二个分支中声明它会导致“重复的局部变量”编译错误。
int a = 3;
switch( a ) {
case 0:
int b = 1;
System.out.println("case 0: b = " + b);
break;
case 1:
// the following line does not compile: b may not have been initialized
// System.out.println("case 1 before: b = " + b);
b = 2;
System.out.println("case 1 after: b = " + b);
break;
default:
b = 7;
System.out.println("default: b = " + b);
}
注意:上面的代码用java 1.6编译器编译。
答案 0 :(得分:22)
范围与往常一样,由{
和}
分隔。
答案 1 :(得分:11)
b
的范围是块。您只有一个包含所有case
的块。这就是您在第二个b
重新声明case
时出现编译错误的原因。
您可以将每个case
包装在自己的块中,例如
case 0:
{
int b = 1;
...
}
case 1:
{
int b = 2;
...
}
但我认为FindBugs或CheckStyle会抱怨这一点。
答案 2 :(得分:4)
b
的范围是切换块 - 在声明和分隔符}
之间 -
int a = 3;
switch( a ) {
case 0:
int b = 1; //scope starts
System.out.println("case 0: b = " + b);
break;
case 1:
// the following line does not compile: b may not have been initialized
// System.out.println("case 1 before: b = " + b);
b = 2;
System.out.println("case 1 after: b = " + b);
break;
default:
b = 7;
System.out.println("default: b = " + b);
}//scope ends
但是,您需要知道,如果您在int b
内声明case 1:
,则无法访问b
要回答您在java评论中提出的问题,您可以查看这个更简单的示例:
int b;
if(true){
b++; //The local variable b hast not been initialized
}
希望它有所帮助。
答案 3 :(得分:4)
您可以使用{}围绕您的案例定义范围。
int a = 3;
switch( a ) {
case 0: {
int b = 1;
System.out.println("case 0: b = " + b);
break;
}
case 1: {
// the following line does not compile: b may not have been initialized
// System.out.println("case 1 before: b = " + b);
int b = 2;
System.out.println("case 1 after: b = " + b);
break;
}
default: {
int b = 7;
System.out.println("default: b = " + b);
}
}
答案 4 :(得分:1)
将永远不会被初始化。你应该在switch语句之前定义b。
答案 5 :(得分:0)
您的case
块没有任何本地范围。这不是一系列if
... else if
... else
块,java将其实现为一系列GOTO
s。
答案 6 :(得分:0)
switch()
语句中定义的变量范围与{
和}
环绕的普通块中的变量范围相同。
因此,switch()
语句中定义的每个变量在整个块定义后都是可见的。