首页 新闻 会员 周边 捐助

java中switch变量的问题

0
悬赏园豆:50 [待解决问题]

如果case 2: 里的int m=10;注释掉会报初始化错误,而不是报未找到找符号“m”这个错误,说明case 1:声明的变量m对于case 2:这里是可见的,如果是可见的那为什么会报未初始化错误呢?

七月渴望的主页 七月渴望 | 初学一级 | 园豆:144
提问于:2014-04-28 13:30
< >
分享
所有回答(1)
0

虽然case1中m对于case2中是可见的,但是你运行代码的时候,num是2,直接到了case2的分支,没有执行case1中的代码,所以没有初始化。建议你看看关于类的初始化的知识。 整个switch是一个代码块,不能定义类型相同、名称相同的变量,所以会有第一个错误。这是编译阶段就会检查的。第二个错误是运行阶段的错误,你运行的时候,没有走到case1,没有进行m的初始化,到case2的时候就报错误。

刘振明 | 园豆:184 (初学一级) | 2014-04-28 15:44

没有执行case 1的话那int m=100;这句也就没执行,也就是变量m根本都没定义啊!执行case 2里面的代码的时候不是应该报未定义错误码?

支持(0) 反对(0) 七月渴望 | 园豆:144 (初学一级) | 2014-04-28 15:49

@七月渴望:太底层的就不清楚了。  这涉及到了堆栈方面的知识。变量的定义和变量的初始化不一定是同时完成的。这里应该是刚进入switch块代码(你应该看看变量的作用域的相关知识),就给所有的变量分配了堆空间,但是并没有初始化。等到走到哪个case,才进行真正的初始化。

支持(0) 反对(0) 刘振明 | 园豆:184 (初学一级) | 2014-04-28 16:10

@刘振明: 作用域这方面还好理解,感觉这问题不是作用域的问题,而是编译器在后台怎么运行的问题了......

支持(0) 反对(0) 七月渴望 | 园豆:144 (初学一级) | 2014-04-28 16:12

@七月渴望:嗯。 

switch(2)
{
case 1:{int a = 10;}
case 2:{int a = 11;}
} 没有问题。加上大括号,定义为局部变量。 

结论:如果case中没有大括号,则所有case中的变量声明是在整个switch块起作用。什么时候初始化可能就是java编译器的事情了。

支持(0) 反对(0) 刘振明 | 园豆:184 (初学一级) | 2014-04-28 16:28

@刘振明:按理说代码是一行一行编译的,如果真的编译了case 1里的代码,那么在case 2里就不应该说未初始化。头痛........

支持(0) 反对(0) 七月渴望 | 园豆:144 (初学一级) | 2014-04-28 16:36

@七月渴望: 不对。java和c不一样,java编译顺序不是一行一行的。类的加载机制不太懂,但不是简单的按照一行行来。你看看java的类加载机制。

支持(0) 反对(0) 刘振明 | 园豆:184 (初学一级) | 2014-04-28 16:39

@刘振明: 但是int m=100;应该是接着编译的嘛!在怎么说也不应该在case 2里报未初始化错误啊!我宁愿它报未定义错误,还能理解..........

支持(0) 反对(0) 七月渴望 | 园豆:144 (初学一级) | 2014-04-28 16:41

@七月渴望:http://www.oschina.net/question/814431_89013 

支持(0) 反对(0) 刘振明 | 园豆:184 (初学一级) | 2014-04-28 16:50

@刘振明: 谢谢了!我在慢慢思考下

支持(0) 反对(0) 七月渴望 | 园豆:144 (初学一级) | 2014-04-28 17:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册