如何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编译器编译。
的范围b
是块。 你只有一个街区,其中包括所有的case
秒。 这就是为什么,当你重新声明得到一个编译错误b
在你的第二个case
。
你可以包装每个case
中的自己像块
case 0:
{
int b = 1;
...
}
case 1:
{
int b = 2;
...
}
但我认为FindBugs的CheckStyle的还是会抱怨说。
的范围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
里面case 0:
要回答你在java问问题的评论,你可以检查这个简单的例子:
int b;
if(true){
b++; //The local variable b hast not been initialized
}
希望能帮助到你。
您可以定义使用在你的情况下,范围{}。
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);
}
}
在你的代码,如果一个不等于0 B将永远不会被初始化。 您switch语句之前,应该定义湾
你的case
块没有任何局部范围。 这不是一个系列if
... else if
... else
块,JAVA实现它为一系列GOTO
秒。
的一个中定义的变量范围switch()
语句将是相同的如在正常块至极由包围{
和}
。
因此,在一个定义的每个变量switch()
语句是针对整个块可见,一旦它被定义。