think in java中一段代码的疑惑,关于switch

public Shape next() {
    switch (random.nextInt(3)) {
    default:
    case 0:
        return new Circle();
    case 1:
        return new Square();
    case 2:
        return new Triangle();
    }
}

 default放在'return new Triangle();'下面,eclipse会出现红x,you must return a result of type Shape,这很好理解

 

default放在'case 0'上面,就不会出现上面的编译错误,不懂是为什么,可能switch-case的机制还没有理解透?

 

哪位大虾帮忙解释解释


问题补充
这是怎么了。。20几个阅读,没有回复的
问题补充
gtssgtss 写道
自动贯穿。。。。
这是一个很垃圾的特性。。。。
太基础了,大家都不想打字,详细还是去看书吧



我被鄙视了。。还真不知道这特性
问题补充
gtssgtss 写道
自动贯穿。。。。
这是一个很垃圾的特性。。。。
太基础了,大家都不想打字,详细还是去看书吧


你说的是哪本书?自动贯穿这名称google没搜到
问题补充
确实是很纠结的一个特性。。
实验了一把
找到了一段话,自己也总结了一点


没有case匹配的时候,执行default中的内容,default中没有退出switch-case的语句,默认执行default下面case下的语句,如果第一个case下没有return,会接着执行下面的case,一直执行到return 语句


switch (10) { 
    default: 
    case 0: 
        System.out.println("0"); 
    case 1: 
        System.out.println("1"); 
    case 2: 
        return new Triangle(); 
    } 


这样改的话,它就会打印出0,1,然后return

问题补充
lqixv 写道
估计你是看书不仔细。你回头看看对 switch 语句的解释,在 case 里,如果没有 break 是不会跳出 switch 的。因此,你把 default 放在后面的话,就相当于 在找不到 0、1、2 时,没有return 值了。而你的方法本应该返回 Shape,那肯定报错了


估计你问题没有看清楚吧,我知道case 没有break是不会跳出的,这里讨论的是如果没有case可以匹配上,default放在最上面,会执行default下的case,直到return或break为止。

动手实验下,一切明了...

自动贯穿。。。。
这是一个很垃圾的特性。。。。
太基础了,大家都不想打字,详细还是去看书吧

[quote="w445097062"][quote="gtssgtss"]自动贯穿。。。。
这是一个很垃圾的特性。。。。
太基础了,大家都不想打字,详细还是去看书吧[/quote]

你说的是哪本书?自动贯穿这名称google没搜到[/quote]

这个特性似乎没有正式的名字,我唯一看到把这个特性命名的地方是javascript语言精粹

你没有break; 哥哥
你想把default 放下面 加个return null;应该可以

估计你是看书不仔细。你回头看看对 switch 语句的解释,在 case 里,如果没有 break 是不会跳出 switch 的。因此,你把 default 放在后面的话,就相当于 在找不到 0、1、2 时,没有return 值了。而你的方法本应该返回 Shape,那肯定报错了

真的不想打字:

case 0:
case 1:
case 2:
return 3;
case 3:
case 4:
return 5;


你的default和case 0同用一个return

[code="java"]public Shape next() {

switch (random.nextInt(3)) {

default: case 0:

return new Circle();

case 1:

return new Square();

case 2:

return new Triangle();

}

} [/code]

这样会不会比较好理解一点...

case没有break或是return是不会跳出直到 } 为止。

若default放到最后面的话会导致缺少了return而报错。

所以才有这样的代码

switch (10) {
default: break;
case 0:
System.out.println("0"); break;
case 1:
System.out.println("1"); break;
case 2:
return new Triangle();
}

还是趁早转行吧

如果default放在最后加上一个return也是正确的,所以就是说明编译器发现你在最后没有返回值,因此报错。要考虑完全,如果default放在最前面没有break和return 他还会继续向下运行,因此不会报错!

额。 。有人回答CASE 0:CASE 1:CASE 2:return Circle();其实也已经说明了问题。我先给一个反汇编后的代码。源代码:
[code="java"]
public static Shape next() {
Random random = new Random();
switch (random.nextInt(3)) {
default:
case 0:
return new Circle();
case 1:
return new Square();
case 2:
return new Triangle();
case 3:
return new Triangle();
}

}

[/code]
这里其实default和case 0:都会返回Circle,把switch (random.nextInt(3)) 改成switch(4)就可以了。

汇编代码如下:
[code="java"]
L1 (5)
LINENUMBER 14 L1
ICONST_5
TABLESWITCH
0: L2
1: L3
2: L4
3: L5
default: L2
L2 (8)
LINENUMBER 17 L2
NEW Circle
DUP
INVOKESPECIAL Circle.()V
ARETURN
[/code]
当是default的时候 就到L2 ,L2 [color=red]NEW Circle[/color] 。

简而言之:

其实就是CASE 0:CASE 1:CASE 2:return Circle();的问题

[quote="qianhd"]还是趁早转行吧 [/quote]
不要这样说别人,都是过来人

freish 这货的头像忒恶心了 想揍人

这个跟if else是一样的撒,default是默认执行的,case好比if,default好比else.

[quote="szcs10138456"]freish 这货的头像忒恶心了 想揍人[/quote]

这么man

case语句相当于goto语句中的标号。标号本身是不起任何控制作用的。
这样应该好理解。

[quote="lantian_123"][quote="qianhd"]还是趁早转行吧 [/quote]
不要这样说别人,都是过来人[/quote]
哈哈哈哈,过来人就不要笑正在过来的人啦。谁没有短路的时候呢,呵呵

第一,肯定每个case都得break
第二,当default放在最后的时候,也必须加return,而你放在第一位,运行的和case0一样

貌似叫case穿透吧。。但是楼主说的不是这个问题。。怀疑是think in java的错误。。要么就是后来的jdk不支持这种写法了。。要么就是eclipse不支持。。要么就是我说错了

[quote="gtssgtss"][quote="w445097062"][quote="gtssgtss"]自动贯穿。。。。
这是一个很垃圾的特性。。。。
太基础了,大家都不想打字,详细还是去看书吧[/quote]

你说的是哪本书?自动贯穿这名称google没搜到[/quote]

这个特性似乎没有正式的名字,我唯一看到把这个特性命名的地方是javascript语言精粹[/quote]
这个行为的名字叫“fall through”。
[quote]As in C and C++, execution of statements in a switch block "falls through labels."[/quote]
<< http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.11

转行吧 楼主 入门的 第三节课上的

放到下面就没有返回值了

[quote="chiaun"][code="java"]public Shape next() {

switch (random.nextInt(3)) {

default: case 0:

return new Circle();

case 1:

return new Square();

case 2:

return new Triangle();

}

} [/code]

这样会不会比较好理解一点...

case没有break或是return是不会跳出直到 } 为止。

若default放到最后面的话会导致缺少了return而报错。[/quote]

不是这样理解的吧。。。
default就是一个大的标签,下面有三个case,在三个case中选择一个返回。

[quote="googya"][quote="chiaun"][code="java"]public Shape next() {

switch (random.nextInt(3)) {

default: case 0:

return new Circle();

case 1:

return new Square();

case 2:

return new Triangle();

}

} [/code]

这样会不会比较好理解一点...

case没有break或是return是不会跳出直到 } 为止。

若default放到最后面的话会导致缺少了return而报错。[/quote]

不是这样理解的吧。。。
default就是一个大的标签,下面有三个case,在三个case中选择一个返回。[/quote]
晕掉了,怎么最后楼是这个答案,很误导大众啊,
如果照你这个说法
case 0:
case 1:
return a;
是不是0也是一个大的标签?

其实default跟其他值的case没什么区别,只不过他表示所有其他值的处理方式,放在前边可以直接break退出,也可以不带break直接进入case 1(例子中的写法)
如果放在后边,就要跟其他case一样的格式,带上返回值!

是这样滴,你Default 放在上面是有默认的放回的..返回Default之后 return之前的内容,Default 放在最后 没有返回匹配的类型..唉.

switch语句,满足了case条件,执行相应的代码后,如果没有break或return,不会跳出switch,而会继续顺序执行下去,至到遇到break或return。
若是default写在前面,至到执行完第5行,才返回。
若是写在后面,没有返回类型,当然就报错咯。

其实大家没有理解楼主的意思
我觉得是因为random.nextInt(3)不会产生0、1、2之外的case分支,所以在default使用自动贯穿,我想这是因为作者的程序已考虑所有分支,所以default放在上面(缺省返回值)反而更简洁。

其实你应该仔细看下代码就明白了。终究还是没有仔细研读代码,太马虎了。

default 应该加返回值,否则整个函数都没有返回值。放在最上面,主要是因为default后没有break,它还会继续往下执行。下面可以返回一个结果,所以没有报错。

好好学习基础