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 java 中文doc文档

    《Think in Java 中文文档》作为一本深入讲解Java编程语言的教材,不仅适合有志于深入学习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 in java(中文版)优质排版

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

    Think Data Structures in Java azw3

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

    java 教程 think in java

    java 教程 think in java,java 教程 think in java

    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 编程思想》是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中创建和管理对象,包括对象的引用、对象的生命周期、类与对象的关系,以及如何通过...

Global site tag (gtag.js) - Google Analytics