0 0

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

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为止。
2011年6月20日 10:41

30个答案 按时间排序 按投票排序

0 0

采纳的答案

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

2011年6月20日 10:41
0 0

好好学习基础

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41
0 0

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


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

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

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



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

晕掉了,怎么最后楼是这个答案,很误导大众啊,
如果照你这个说法
case 0:
case 1:
   return a;
是不是0也是一个大的标签?

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

2011年6月20日 10:41
0 0

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


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

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

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



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

2011年6月20日 10:41
0 0

放到下面就没有返回值了

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41
0 0

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


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


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

这个行为的名字叫“fall through”。
引用
As in C and C++, execution of statements in a switch block "falls through labels."

<< http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.11

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41
0 0

lantian_123 写道
qianhd 写道
还是趁早转行吧

不要这样说别人,都是过来人

哈哈哈哈,过来人就不要笑正在过来的人啦。谁没有短路的时候呢,呵呵

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41
0 0

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



这么man

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41
0 0

qianhd 写道
还是趁早转行吧

不要这样说别人,都是过来人

2011年6月20日 10:41
0 0

额。 。有人回答CASE 0:CASE 1:CASE 2:return Circle();其实也已经说明了问题。我先给一个反汇编后的代码。源代码:

	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();
		}

	}

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

汇编代码如下:
 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.<init>()V
    ARETURN

当是default的时候 就到L2 ,L2   NEW Circle


简而言之:

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

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41
0 0

还是趁早转行吧

2011年6月20日 10:41
0 0

所以才有这样的代码

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

2011年6月20日 10:41
0 0

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


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

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

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

2011年6月20日 10:41
0 0

真的不想打字:


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


----------
你的default和case 0同用一个return

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41
0 0

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


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


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

2011年6月20日 10:41
0 0

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

2011年6月20日 10:41

相关推荐

    Think in java第三版代码

    "Think in Java第三版代码"则提供了书中习题和示例的源代码,便于读者理解和实践。 在提供的压缩包文件中,我们可以看到以下文件: 1. `tij.jcsc`:这可能是《Think in Java》书中某个章节或习题的Java类文件,...

    think in java4源代码

    《Think in Java 4》是Java编程领域的一部经典之作,由Bruce Eckel撰写,它以其深入浅出的讲解方式和丰富的示例代码深受程序员喜爱。这个压缩包包含的就是这本书的全部源代码,旨在帮助读者更好地理解和实践书中所...

    Think in Java3

    《Think in Java 3》是一本深受欢迎的Java编程指南,由Bruce Eckel撰写,它以其详尽的解释和丰富的示例闻名。这本书是许多Java初学者和专业开发者的重要参考资料,旨在帮助读者深入理解Java语言的核心概念和机制。...

    Think in java 中文第四版第二部分 (非扫描,瑕疵版)

    《Think in Java 中文第四版》是学习Java编程的经典之作,由Bruce Eckel撰写,它深入浅出地讲解了Java语言的核心概念和技术。本部分主要涵盖的是书籍的第二部分,通常涉及面向对象编程的深入探讨,包括类、对象、...

    think in java source code

    以下是对《Think in Java》源码中一些重要知识点的详细解读: 1. **面向对象编程基础**:书中通过丰富的例子展示了类、对象、封装、继承和多态等面向对象编程的基本概念。源码中你可以看到如何定义类,如何创建对象...

    think in java 练习

    《Think in Java》是 Bruce Eckel 的经典著作,它深入浅出地讲解了Java编程语言的核心概念和技术。这本书强调理解编程思想,而不仅仅是学习语法。练习题是学习过程中的重要部分,它们帮助我们巩固理论知识,提升实际...

    Think in java 源码构建编译

    Think in java 源码构建编译

    think in java 英文第四版 高清完整PDF版

    java think in java (英文第四版)至今为止 被认为是java教程之中权威作品之一

    think-in-java

    《Think in Java》是Java编程领域的一本经典著作,由Bruce Eckel撰写,中文版的出现使得更多中国程序员能够深入理解和掌握Java编程语言的核心概念。这本书以其深入浅出的讲解方式,深受程序员们的喜爱,是许多初学者...

    think in java 4 源码 eclipse工程版

    think in java 第四版 源码以及作业 eclipse版本 包含jar包 可以直接导入eclipse

    think in java 习题、代码

    《Think in Java》是Bruce Eckel的经典编程教材,它深入浅出地讲解了Java语言的各个方面,深受程序员喜爱。这个压缩包包含的资源是该书的习题解答和相关代码,对于学习和进阶Java编程有着极大的帮助。 一、...

    Think Data Structures in Java azw3

    Think Data Structures in Java 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Think In Java 4(完美高清中文版).

    《Think In Java 4》是Java编程领域里一本极具影响力的著作,由资深程序员 Bruce Eckel 编著。这本书以其深入浅出的讲解方式和全面的知识覆盖而闻名,被誉为Java学习者的经典读物。中文版的完美高清版本为国内读者...

    Think in java3(中文完整版)

    《Think in Java 3(中文完整版)》是Java编程领域的一本经典著作,由Bruce Eckel撰写,针对中文读者提供了完整的翻译版本。这本书旨在帮助读者深入理解Java语言,建立起面向对象编程的思想,并掌握实际开发中的技巧。...

    Think in java(中文版)优质排版

    Think in Java(美)Bruce Eckel 著 陈昊鹏 译 引言 同人类任何语言一样,Java为我们提供了一种表达思想的方式。如操作得当,同其他方式相 比,随着问题变得愈大和愈复杂,这种表达方式的方便性和灵活性会显露无遗。 ...

    Think in JAVA 编程思想 第四版 清晰扫描版

    《Think in JAVA 编程思想》是Java编程领域的一本经典著作,由Bruce Eckel撰写。第四版作为该书的最新版本,包含了作者对Java语言深入的理解和丰富的编程经验,旨在帮助读者理解面向对象编程的核心理念,并提升编程...

    Think in Enterprise JAVA

    《Think in Enterprise JAVA》是基于Java企业级应用的深度解析,由知名编程专家Bruce Eckel撰写。这本书以其独特的视角和深入浅出的讲解方式,帮助读者理解并掌握在企业环境中使用Java进行开发的关键技术和思想。 ...

    think in java 第11章 持有对象

    《Think in Java》是Java编程领域的一本经典著作,作者是Bruce Eckel。第11章的主题是“持有对象”,这一章主要探讨了如何在Java中创建和管理对象,包括对象的引用、对象的生命周期、类与对象的关系,以及如何通过...

    Think In Java.chm

    抽象的进步 1.2 对象的接口 1.3 实现方案的隐藏 1.4 方案的重复使用 1.5 继承:重新使用接口 1.5.1 改善基础类 1.5.2 等价和类似关系 1.6 多形对象的互换使用 1.6.1 动态绑定 ...1.11 Java和因特网

Global site tag (gtag.js) - Google Analytics