当前位置:编程学习 > JAVA >>

很弱的问题,求解惑。。。

代码如下:


public class TestBianliang {

public static void main(String[] args) {
outputValue(1);
}

private static void outputValue(int a) {
switch (a) {
case 1:
int b = 0;
System.out.print(b);
break;
case 2:
int c = b;
System.out.print(c);
break;
}
}

}

以上,简单的代码中,我记得java中变量的作用范围是在其所在{}中,为什么在case 1:中定义的b,在case 2:不能用。提示:The local variable b may not have been initialized。可是在case 1中已经初始化了。
求解
--------------------编程问答-------------------- 你这个问题确实是很弱智哈,switch case 就类似于if else 你把他翻译成if else 就明白为什么报这个错了 --------------------编程问答-------------------- 把每个case和break对看着一块,各块互不相关,就明白了 --------------------编程问答-------------------- 这是因为你前篇一律的看这个局部变量的有效范围了,不能看到{}就认为其中所有初始化的变量都能用在其中的语句中,这里 的case语句就是这样,一个case语句就相当于一个{}所以case1:中的b只能用在case1中,在case2是无效的。 --------------------编程问答--------------------
引用 3 楼 david_tsai23 的回复:
这是因为你前篇一律的看这个局部变量的有效范围了,不能看到{}就认为其中所有初始化的变量都能用在其中的语句中,这里 的case语句就是这样,一个case语句就相当于一个{}所以case1:中的b只能用在case1中,在case2是无效的。


就是这样子的。。。用点心。。。 --------------------编程问答-------------------- 同楼上 --------------------编程问答-------------------- --------------------编程问答-------------------- 更多的大牛,你会在这里一一发现。 --------------------编程问答-------------------- 还真没有注意过这个问题! --------------------编程问答-------------------- 那个局部变量来的,一出来就被回收掉啦。 --------------------编程问答--------------------
引用 3 楼 david_tsai23 的回复:
这是因为你前篇一律的看这个局部变量的有效范围了,不能看到{}就认为其中所有初始化的变量都能用在其中的语句中,这里 的case语句就是这样,一个case语句就相当于一个{}所以case1:中的b只能用在case1中,在case2是无效的。


  一语命中。 --------------------编程问答-------------------- 换了个马甲就不认识了…… --------------------编程问答--------------------
引用 1 楼 dreamslink2010 的回复:
你这个问题确实是很弱智哈,switch case 就类似于if else 你把他翻译成if else 就明白为什么报这个错了


哥们继续求解啊:
代码如下:

public class Case {

/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub

outPut(2);
}


private static void outPut(int i) {
switch (i) {
case 1:
int a = 3;
System.out.print(a);
break;
case 2:
a = 10;
System.out.print(a);
break;
}
}

private static void outPut1(int j) {
if (j == 1) {
int a = 10;
} else if (j ==2) {
// a =100;
}
}
}


如果我在case1中定义了int a,如果if else的话,那么为什么我在case2中业可以用那,求解啊,谢谢。 --------------------编程问答-------------------- 原来还真没注意到,学习了 --------------------编程问答-------------------- 编译不可能会通过吧?
那case X之间都是并立的关系。 --------------------编程问答-------------------- 3楼回复的很透彻啊 --------------------编程问答-------------------- case 1是一个作用域,case 2是另外一个作用域,两个作用域是相互独立的,也就是说退出其中一个作用域其中的所有变量就不存在了。 --------------------编程问答--------------------
引用 3 楼 david_tsai23 的回复:
这是因为你前篇一律的看这个局部变量的有效范围了,不能看到{}就认为其中所有初始化的变量都能用在其中的语句中,这里 的case语句就是这样,一个case语句就相当于一个{}所以case1:中的b只能用在case1中,在case2是无效的。


再请教一下啊:
public class Case {

/**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub

outPut(2);
}


private static void outPut(int i) {
switch (i) {
case 1:
int a = 3;
System.out.print(a);
break;
case 2:
a = 10;
System.out.print(a);
break;
}
}

}

上面的代码是正确的。。。在case 1里面定义的,在case 2里面也可以用。。。不知道为啥。。。 --------------------编程问答--------------------
引用 3 楼 david_tsai23 的回复:
这是因为你前篇一律的看这个局部变量的有效范围了,不能看到{}就认为其中所有初始化的变量都能用在其中的语句中,这里 的case语句就是这样,一个case语句就相当于一个{}所以case1:中的b只能用在case1中,在case2是无效的。

好好想想噶 --------------------编程问答--------------------
引用 3 楼 david_tsai23 的回复:
这是因为你前篇一律的看这个局部变量的有效范围了,不能看到{}就认为其中所有初始化的变量都能用在其中的语句中,这里 的case语句就是这样,一个case语句就相当于一个{}所以case1:中的b只能用在case1中,在case2是无效的。

一个一个case语句就相当于一个{}好像不怎么准确啊! --------------------编程问答-------------------- 同3楼啊 --------------------编程问答--------------------
引用楼主 myg_315 的回复:
代码如下:


public class TestBianliang {

public static void main(String[] args) {
outputValue(1);
}

private static void outputValue(int a) {
switch (a) {
case 1:
int b = 0;
System.out.print……




public class test {

public static void main(String[] args)
{
outputValue(1);
}

private static void outputValue(int a) 
{
//代码片段一 (switch case)
// switch (a)
// {
// case 1:
// int b = 0;
// System.out.print(b);
// break;
// case 2:
// int c = b;
// System.out.print(c);
// break;
// }

//代码片段二(if else) 
if(a==1)
{
int b = 0;
System.out.println(b);
}else if (a == 2) {
int c = b;
System.out.println(c); 
}
}

//PS:代码片段一 等效于 代码片段二   ,再结合你自己说的这句话:"我记得java中变量的作用范围是在其所在{}中 "
}
--------------------编程问答--------------------
引用 21 楼 dreamslink2010 的回复:
引用楼主 myg_315 的回复:
代码如下:


public class TestBianliang {

public static void main(String[] args) {
outputValue(1);
}

private static void outputValue(int a) {
switch (a) {
case 1:
int b = ……


不是,哥们,看下面的黑体在switch  case中是正确的:
switch (a)
        {
        case 1:
            int b = 0;
            System.out.print(b);
            break;
        case 2:
            b = 100;
            System.out.print(b);
            break;
        }

如果上面转换成if else 很显然不正确...求解答,谢谢。 --------------------编程问答--------------------
引用 22 楼 myg_315 的回复:
引用 21 楼 dreamslink2010 的回复:

引用楼主 myg_315 的回复:
代码如下:


public class TestBianliang {

public static void main(String[] args) {
outputValue(1);
}

private static void outputValue(int a) {
……


这个问题还真没发现... 我去Java官网、《Thinking in Java》也没找到答案;

“开关”(Switch)有时也被划分为一种“选择语句”。根据一个整数表达式的值,switch 语句可从一系列
代码选出一段执行。它的格式如下:
switch(整数选择因子) {
case 整数值1 : 语句; break;
case 整数值2 : 语句; break;
case 整数值3 : 语句; break;
case 整数值4 : 语句; break;
case 整数值5 : 语句; break;
//..
default:语句;

在语法中讲解并没有向以下方式解说:
switch(整数选择因子) {
case 整数值1 :{ 语句;}break;
case 整数值2 :{ 语句;} break;

//..
default:{语句;}

一般按照正常理解 代码都是在语句块里面的,但是这个开关流程控制...
要是加上{}括号,变量的作用域就缩小了 ;网上解说switch-case文章中提到"case可以不带括号",但是并没有说明带与不带有点区别 ;不加括号,上面声明的变量在下面的case块里面就可以使用;要是加上括号就不同性质了 --------------------编程问答--------------------
引用 23 楼 dreamslink2010 的回复:
引用 22 楼 myg_315 的回复:

引用 21 楼 dreamslink2010 的回复:

引用楼主 myg_315 的回复:
代码如下:


public class TestBianliang {

public static void main(String[] args) {
outputValue(1);
}

private static voi……



谢谢啊。。。 --------------------编程问答-------------------- JDK7 对switch-case改造了 ,选择因子 支持字符串了
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
--------------------编程问答-------------------- 如果程序进不去case1的话 b的赋值对于c来说等于没有,因为程序没有走定义b变量的语句 --------------------编程问答-------------------- 3楼说的很清楚。楼主自己分析一下应该也能明白的。如果你的a不是1,是2的话,那么b的声明语句就没有被执行到。当然会提示你b没有初始化了。编译器只会按照最严格的方式来检查你的语法,尽量避免一切可能得错误。所以不要有意刁难编译器哈。哈哈哈~ --------------------编程问答--------------------
引用 22 楼 myg_315 的回复:
引用 21 楼 dreamslink2010 的回复:

引用楼主 myg_315 的回复:
代码如下:


public class TestBianliang {

public static void main(String[] args) {
outputValue(1);
}

private static void outputValue(int a) {
s……

我调试了一下,当你换成if语句的时候,每一条的if语句都会被执行一遍,断点会走到每条if语句;
但是如果是switch-case的话,你设置断点后,断点会直接跳到符合你条件的case中,而不是每个case走一遍。所以我想应该是编译机制的问题。可能就像上面说的,每个case是并列的,是不是在编译中会一并处理,然后再进行条件检查?等待高手解答。 --------------------编程问答--------------------
引用 27 楼 duxiaweijiaoda 的回复:
3楼说的很清楚。楼主自己分析一下应该也能明白的。如果你的a不是1,是2的话,那么b的声明语句就没有被执行到。当然会提示你b没有初始化了。编译器只会按照最严格的方式来检查你的语法,尽量避免一切可能得错误。所以不要有意刁难编译器哈。哈哈哈~


帮忙解答下22楼的问题吧。谢谢 --------------------编程问答--------------------
引用 26 楼 n110224 的回复:
如果程序进不去case1的话 b的赋值对于c来说等于没有,因为程序没有走定义b变量的语句


帮忙解答下22楼的疑问,谢谢。 --------------------编程问答--------------------
引用 29 楼 myg_315 的回复:
引用 27 楼 duxiaweijiaoda 的回复:

3楼说的很清楚。楼主自己分析一下应该也能明白的。如果你的a不是1,是2的话,那么b的声明语句就没有被执行到。当然会提示你b没有初始化了。编译器只会按照最严格的方式来检查你的语法,尽量避免一切可能得错误。所以不要有意刁难编译器哈。哈哈哈~


帮忙解答下22楼的问题吧。谢谢

28楼是我给出的看法。希望和大家继续交流。 --------------------编程问答-------------------- public class Second {

  public static void main(String[] args) {
   outputValue(2);
  }

  private static void outputValue(int a) {
   switch (a) {
   case 1:
   int b=0;
   
   System.out.print(b);
   break;
   
   case 2:
  int c =b;              //在这里提示the variable may not have been initialized
   System.out.print(c);
   break;
   }
  }
}

上例程序最为诡异,为什么会这样说呢?

在两个不同的case 里   case 2 里的变量b 可以看到case 1 里的变量b的声明,但是看不到它的初始化; 

所以此时若 想用b ,要在case 2 里在进行初始化

‍case 2:

b=0;
  int c =b;
   System.out.print(c);
   break;
这样以后就可以使用了!!!!



我看这应该是编译器的漏洞吧!!!



另外再提两点:::

1因为b 可以看到case  1中的声明  ,所以在case 2 中不可以在定义另一个b;  只可一对b进行初始化;

2此段程序  中  两个case 若全都用 {} 将自己的代码段包裹起来,则不会有这种现象了;



所以大括弧的使用 很重要啊!!!!
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,