关于switch 的迷惑,该怎么解决
关于switch 的迷惑
先放代码
再看一下代码,和问题二的比较.
------解决方案--------------------
public No sel(){
switch(i){
default:
case 0:return new No1();
case 1:return new No2();
case 2:return new No3();
}
}
你的问题是:执行到首先执行default:因为没有break;所以继续往下走
如果去掉default,因为编译器会考虑i不是0,1,2的情况,但你没有处理,所以不能允许你通过编译。
改成这样:
public No sel() {
System.out.println(i);
switch (i) {
case 0:
return new No1();
case 1:
return new No2();
case 2:
return new No3();
default:
return null;//因为你的方法必须返回一个No类型的对象,所以这里需要返回语句。
}
}
public void ret(){
switch(i){
//default:
case 0:System.out.println("1");
case 1:System.out.println("2");
case 2:System.out.println("3");
}
}
这个因为返回类型为void,没有default直接跳出方法就可以了。而上面的方法必须返回一个对象。
------解决方案--------------------
抱歉,报错不会是switch的问题,是其它的问题!另外像你这样用switch的,千年罕见啊!
------解决方案--------------------
同意二楼的观点
是返回值的问题
------解决方案--------------------
去掉default后程序提示错误,是因为编译器检查时发现你的程序不能确保返回No对象,加上default不出错,是因这时default:和case 0:用的是同一条返回语句,这时如果i不是0,1,2的话就会一直返回No1对象.
先放代码
- Java code
import java.util.*; class No{ void thePri(){ System.out.println("NO"); } } class No1 extends No{ void thePri(){ System.out.println("NO1"); } } class No2 extends No{ void thePri(){ System.out.println("NO2"); } } class No3 extends No{ void thePri(){ System.out.println("NO3"); } } /* 疑问就在下面的代码中 问题一:去掉default后程序提示错误!这里有我设定3个随机数,分别已经对应了,为什么没有default不能运行? 问题二:当我建立RandomNo对象时,并调用sel()方法,返回值是No,方法里面的switch 语句并没有break语句,比如得到的随机数 是1,那么就是执行return new No2(),而后面没有break,程序理应当会继续执行接下来的return new No3(),也就是说 每次调用这个方法时,只会返回new No3(),不会分别返回相应的内容。 但是结果不是这样的,而是会自行返回相应的内容?这是为什么??? */ class RandomNo{ private Random rand = new Random(); private int i = rand.nextInt(3); public No sel(){ switch(i){ default: case 0:return new No1(); case 1:return new No2(); case 2:return new No3(); } } } public class Demo1{ public static void main(String[] args){ RandomNo del = new RandomNo(); No a = new No(); a = del.sel(); a.thePri(); } }
再看一下代码,和问题二的比较.
- Java code
import java.util.*; /* 这里就可以去掉default,假设i 得到的随机数字是0,就会执行System.out.println("1"),因为后面没有break 就继续执行System.out.println("2");System.out.println("3");结果就是: 1 2 3 为什么这里遵守switch的原则,而上面则不是?? */ class RandomPro{ private Random rand = new Random(); private int i = rand.nextInt(3); public void ret(){ switch(i){ //default: case 0:System.out.println("1"); case 1:System.out.println("2"); case 2:System.out.println("3"); } } } public class Demo2{ public static void main(String[] args){ RandomPro a = new RandomPro(); a.ret(); } }
------解决方案--------------------
public No sel(){
switch(i){
default:
case 0:return new No1();
case 1:return new No2();
case 2:return new No3();
}
}
你的问题是:执行到首先执行default:因为没有break;所以继续往下走
如果去掉default,因为编译器会考虑i不是0,1,2的情况,但你没有处理,所以不能允许你通过编译。
改成这样:
public No sel() {
System.out.println(i);
switch (i) {
case 0:
return new No1();
case 1:
return new No2();
case 2:
return new No3();
default:
return null;//因为你的方法必须返回一个No类型的对象,所以这里需要返回语句。
}
}
public void ret(){
switch(i){
//default:
case 0:System.out.println("1");
case 1:System.out.println("2");
case 2:System.out.println("3");
}
}
这个因为返回类型为void,没有default直接跳出方法就可以了。而上面的方法必须返回一个对象。
------解决方案--------------------
抱歉,报错不会是switch的问题,是其它的问题!另外像你这样用switch的,千年罕见啊!
------解决方案--------------------
同意二楼的观点
是返回值的问题
------解决方案--------------------
去掉default后程序提示错误,是因为编译器检查时发现你的程序不能确保返回No对象,加上default不出错,是因这时default:和case 0:用的是同一条返回语句,这时如果i不是0,1,2的话就会一直返回No1对象.