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的机制还没有理解透?
哪位大虾帮忙解释解释
动手实验下,一切明了...
自动贯穿。。。。
这是一个很垃圾的特性。。。。
太基础了,大家都不想打字,详细还是去看书吧
[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,它还会继续往下执行。下面可以返回一个结果,所以没有报错。
好好学习基础