switch (i) {
case 1:
String q_type = "2";
break;
case 99:
q_type = "3";
break;
}
以上代码,为什么能编译通过并执行,如果 i=99的话 q_type并没有定义啊
这是为什么
case 1:
String q_type = "2";
break;
case 99:
q_type = "3";
break;
}
以上代码,为什么能编译通过并执行,如果 i=99的话 q_type并没有定义啊
这是为什么
解决方案 »
- struts2的action不能跳转到JSP页面
- 求 java对应的 socket 校验和(有相关.net代码)
- Hibernate分页
- javascript事件 后退功能如何实现?
- 请大家看一下为什么这段代码会出错,我已经启动了weblogic服务器呀 菜鸟问题
- 一个很小的问题
- 高分求助啊,,用struts的时候提示java.lang.NoClassDefFoundError: org/apache/commons/beanutils/Converter
- 想让大家讨论下,在ejb web server 方面的好书都有那些,造福大家
- hibernate连接数据库出现问题
- SSM框架搭建的疑问
- 关于Ajax服务器响应的问题
- 图书管理系统的简单问题
case1 就相当于if(**){
String q_type = "2";
}
就是个局部变量。方法内部。
局部变量,你在case方法体外部能访问?要真的能访问,那才真的奇怪了
switch (i) {
case 1:
String q_type = "2";//你这里有声明为一个switch的局部变量
break;
case 99:
q_type = "3";//这里q_type缺不属于switch的局部变量
break;
}
不是,q_type就是switch里的一个局部变量,不是单属于某一个case的
我没说属于一个case的变量啊
是不是能说明 q_type 是整个switch的局部变量。
执行的时候是99的话,就跳过了String q_type 的定义。
是不是这样子啊~!
原因:都处于switch下面的{},所以你就把它看成一个普通的代码块。如果你不想叫他用,就把它写在case内部的一个{}里面就完了
case 1:
String q_type = "2";
break;
与case {
String q_type = "2";
break;
}
完全不同啊,请大侠详解,越深入越好
和if 一样,变量的作用域问题!
public static void main(String args[])
{
int key = 99;
switch(key)
{
case 1: // '\001'
{
System.out.println("~~~~~~~~~~~~~~~");
String type = "type_1";
System.out.println(type);
break;
} case 99: // 'c'
{
String type = "type_99";
System.out.println(type);
break;
}
}
}
When the switch statement is executed, first the Expression is evaluated. If evaluation of the Expression completes abruptly for some reason, the switch statement completes abruptly for the same reason. Otherwise, execution continues by comparing the value of the Expression with each case constant.
字节码如下:
0: bipush 99
2: istore_1
3: iload_1
4: lookupswitch{ //2 1: 32; 99: 38; default: 41 }
32: ldc #2; //String 2
34: astore_2
35: goto 41
38: ldc #3; //String 3
40: astore_2
41: return
确实是同一个变量
case 1:{
String q_type = "2";
break;
}
case 99:
q_type = "3";//报错,没有定义变量
break;
变量声明在内部了,所以只对第一个case有用。正确的是生命倒switch外面.例如:String q_type="";
switch (i) {
case 1:
q_type = "2";
break;
case 99:
q_type = "3";
break;
}
这样就没事了。
还有楼上的朋友。谁都没说什么都会的。技术没有谁做到全面的,人家有困难咱们就帮帮,没必要说别的。
case 1:
{String q_type = "2";}
break;
case 99:
q_type = "3";
break;
}
这样报错!
public class a {
public static void main(String []args){
int i=3;
switch(i){
case 1:
mytest m=new mytest();
break;
case 3:
m=new mytest();//顺利通过编译
//m.a=3; 编译报错 m未初始化
System.out.println(m.a);
break;
}
}
}class mytest{
int a =0;
public mytest(){
System.out.println("进入了!");
}
}经过测试我得出的结论是:执行switch内部的每个case中的引用提出来放在当前case之前
String q_type = "2";
q_type = "3";
其实是改变q_type 指向的地址 相当于上面例子的mytest m=new mytest();
{
byte byte0 = 9;
String s;
switch(byte0)
{
case 1: // '\001'
s = "2";
break; case 99: // 'c'
s = "3";
break;
}
}楼主以后了解JVM编译机制的问题可以用先编译 再反编译解决 ! 楼主的代码 可以翻遍成如上的代码 byte byte0 = 9;
这个是我定义的一个 int i = 9 可能编译有点问题 但是足够解决楼主的问题了 !