关于default的一个问题

「已注销」 2013-08-24 09:44:03
public class DefaultTest {

private static int next(int i) {
switch(i) {
// 这里加default的理由是什么?而且为什么必须加在这里才行。
default:
case 0: return 0;
case 1: return 1;
}
}

public static void main(String[] args) {
int[] arr = new int[2];
for(int i = 0; i < arr.length; i++) {
arr[i] = next(i);
}
for(int i : arr) {
System.out.println(i);
}
}

}

上述代码如果去掉default编译器会报‘缺少返回语句’的错误。不是很理解,希望有人能够解答,谢谢!
...全文
186 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
麦田 2013-08-25
  • 打赏
  • 举报
回复
应该要break一下吧
valenon 2013-08-25
  • 打赏
  • 举报
回复
引用 楼主 wangliyunzero 的回复:
public class DefaultTest {
	
	private static int next(int i) {
		switch(i) {
            // 这里加default的理由是什么?而且为什么必须加在这里才行。
			default:
			case 0: return 0; 
			case 1: return 1; 
		}
	}
	
	public static void main(String[] args) {
		int[] arr = new int[2];
		for(int i = 0; i < arr.length; i++) {
			arr[i] = next(i);
		}
		for(int i : arr) {
			System.out.println(i);
		}
	}
	
}
上述代码如果去掉default编译器会报‘缺少返回语句’的错误。不是很理解,希望有人能够解答,谢谢!
还是用事实说话,将你的代码生成的class反编译之后,看到next方法变成了这样:

private static int next(int i)
  {
    switch (i) {
      case 0:
      default:
         return 0;
      case 1: 
    } 
    return 1;
  }
编译器认为你那样写的意思是,在i为0或缺省情况下,因为没有break,所以都返回0,在i为1的情况下,虽然退出了switch,但最后还是返回了1. 当default方法放在最后的话,0的时候返回0,1的时候返回1,而default,因为return本身起了break的作用,所以default的情况下,就没有返回了,所以程序无法编译。 所以default方法在中间也是可以编译的。
末日哥 2013-08-24
  • 打赏
  • 举报
回复
估计java编译器对分支选择结构的检查机制就是这样,方法有返回值,就必须考虑到不满足条件的情况 即使这么写也不能通过
    public int f() {
    	if(true) {
    		return 1;
    	}
    }
「已注销」 2013-08-24
  • 打赏
  • 举报
回复
引用 8 楼 wangliyunzero 的回复:
[quote=引用 7 楼 fudongrifdr 的回复:] 你把default放前面没有break所以会进入case0,调用retrun 0,放后面可以啊,return一个值啊! - -。你这么个改法真不知道你在想什么。。好好看看书理解一下switch的执行过程。。
rand.nextInt(2) 的结果只有1,2,那switch里已经有对应这两个值得放回语句,那为什么要额外需要返回值?[/quote] 是0,1
「已注销」 2013-08-24
  • 打赏
  • 举报
回复
引用 7 楼 fudongrifdr 的回复:
你把default放前面没有break所以会进入case0,调用retrun 0,放后面可以啊,return一个值啊! - -。你这么个改法真不知道你在想什么。。好好看看书理解一下switch的执行过程。。
rand.nextInt(2) 的结果只有1,2,那switch里已经有对应这两个值得放回语句,那为什么要额外需要返回值?
末日哥 2013-08-24
  • 打赏
  • 举报
回复
你把default放前面没有break所以会进入case0,调用retrun 0,放后面可以啊,return一个值啊! - -。你这么个改法真不知道你在想什么。。好好看看书理解一下switch的执行过程。。
2013-08-24
  • 打赏
  • 举报
回复
引用 4 楼 wangliyunzero 的回复:
[quote=引用 2 楼 u011797887 的回复:] 如果你去掉default 当i的值不是0和1时 就没有执行语句,所以会执行default 的语句,你的default 后没有语句也没break 所以会执行case 0的语句 执行完毕后 没有break 又会执行case1的语句,最后才会执行完毕。 其实你的default 可以放在最后,然后加一个break就好了 不知道对不对 拙见 献丑了
代码我修改了下,在三楼,你可以看下,这个default加上的原因应该不是你说的这个 还有我试验了下,如果把default放在最后,需要在后面加上return语句,加上break还是会报缺少返回值的错误。[/quote] 加上break,当default的时候,你跳出循环,你也没返回值啊。所以会报错。 既然方法有返回值,你就必须让其在所有的情况下返回一个值。否则就会出现错误。
「已注销」 2013-08-24
  • 打赏
  • 举报
回复
引用 1 楼 fudongrifdr 的回复:
不一定要在那里加default 不加会报错的原因是因为如果i不是0或1的话,方法就缺少返回值 你可以在switch外面return一个值也行
我把default加在switch语句的最后面,为什么会报错? 还有如果我代码改成这样
public class DefaultTest {
	
	private static java.util.Random rand = new java.util.Random(47);
	
	private static int next() {
		switch(rand.nextInt(2)) {
			default:
			case 0: return 0; 
			case 1: return 1; 
            // default: 加在这里会报错
		}
	}
	
	public static void main(String[] args) {
		int[] arr = new int[2];
		for(int i = 0; i < arr.length; i++) {
			arr[i] = next();
		}
		for(int i : arr) {
			System.out.println(i);
		}
	}
	
}
这样的话switch中只可能出现0,1两种情况之一,那为什么还要额外加上一条返回语句呢?
「已注销」 2013-08-24
  • 打赏
  • 举报
回复
引用 2 楼 u011797887 的回复:
如果你去掉default 当i的值不是0和1时 就没有执行语句,所以会执行default 的语句,你的default 后没有语句也没break 所以会执行case 0的语句 执行完毕后 没有break 又会执行case1的语句,最后才会执行完毕。 其实你的default 可以放在最后,然后加一个break就好了 不知道对不对 拙见 献丑了
代码我修改了下,在三楼,你可以看下,这个default加上的原因应该不是你说的这个 还有我试验了下,如果把default放在最后,需要在后面加上return语句,加上break还是会报缺少返回值的错误。
「已注销」 2013-08-24
  • 打赏
  • 举报
回复
我把default加在switch语句的最后面,为什么会报错? 还有如果我代码改成这样
public class DefaultTest {
	
	private static java.util.Random rand = new java.util.Random(47);
	
	private static int next() {
		switch(rand.nextInt(2)) {
			default:
			case 0: return 0; 
			case 1: return 1; 
            // default: 加在这里会报错
		}
	}
	
	public static void main(String[] args) {
		int[] arr = new int[2];
		for(int i = 0; i < arr.length; i++) {
			arr[i] = next();
		}
		for(int i : arr) {
			System.out.println(i);
		}
	}
	
}
这样的话switch中只可能出现0,1两种情况之一,那为什么还要额外加上一条返回语句呢?
AmySun_niit 2013-08-24
  • 打赏
  • 举报
回复
如果你去掉default 当i的值不是0和1时 就没有执行语句,所以会执行default 的语句,你的default 后没有语句也没break 所以会执行case 0的语句 执行完毕后 没有break 又会执行case1的语句,最后才会执行完毕。 其实你的default 可以放在最后,然后加一个break就好了 不知道对不对 拙见 献丑了
末日哥 2013-08-24
  • 打赏
  • 举报
回复
不一定要在那里加default 不加会报错的原因是因为如果i不是0或1的话,方法就缺少返回值 你可以在switch外面return一个值也行
Java8新特性及实战视频教程完整版Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用Lambda 表达式可以使代码变的更加简洁紧凑。Java8实战视频-01让方法参数具备行为能力Java8实战视频-02Lambda表达式初探Java8实战视频-03Lambda语法精讲Java8实战视频-04Lambda使用深入解析Java8实战视频-05Lambda方法推导详细解析-上.wmvJava8实战视频-06Lambda方法推导详细解析-下Java8实战视频-07Stream入门及Stream在JVM中的线程表现Java8实战视频-08Stream知识点总结Stream源码阅读Java8实战视频-09如何创建Stream上集Java8实战视频-10如何创建Stream下集.wmvJava8实战视频-11Stream之filter,distinct,skip,limit,map,flatmap详细介绍Java8实战视频-12Stream之Find,Match,Reduce详细介绍Java8实战视频-13NumericStream的详细介绍以及和Stream之间的相互转换Java8实战视频-14Stream综合练习,熟练掌握API的用法Java8实战视频-15在Optional出现之前经常遇到的空指针异常.wmvJava8实战视频-16Optional的介绍以及API的详解Java8实战视频-17Optional之flatMap,综合练习,Optional源码剖析Java8实战视频-18初识Collector体会Collector的强大Java8实战视频-19Collector使用方法深入详细介绍-01Java8实战视频-20Collector使用方法深入详细介绍-02Java8实战视频-21Collector使用方法深入详细介绍-03.wmvJava8实战视频-22Collector使用方法深入详细介绍-04Java8实战视频-23Collector原理讲解,JDK自带Collector源码深度剖析Java8实战视频-24自定义Collector,结合Stream的使用详细介绍Java8实战视频-25Parallel Stream编程体验,充分利用多核机器加快计算速度Java8实战视频-26Fork Join框架实例深入讲解Java8实战视频-27Spliterator接口源码剖析以及自定义Spliterator实现一个Stream.wmvJava8实战视频-28Default方法的介绍和简单的例子Java8实战视频-29Default方法解决多重继承冲突的三大原则详细介绍Java8实战视频-30多线程Future设计模式原理详细介绍,并且实现一个Future程序Java8实战视频-31JDK自带Future,Callable,ExecutorService介绍Java8实战视频-32实现一个异步基于事件回调的Future程序.wmvJava8实战视频-33CompletableFuture用法入门介绍Java8实战视频-34CompletableFuture之supplyAsync详细介绍Java8实战视频-35CompletableFuture流水线工作,join多个异步任务详细讲解Java8实战视频-36CompletableFuture常用API的重点详解-上Java8实战视频-37CompletableFuture常用API的重点详解-下Java8实战视频-38JDK老DateAPI存在的问题,新的DateAPI之LocalDate用法及其介绍.wmvJava8实战视频-39New Date API之LocalTime,LocalDateTime,Instant,Duration,Period详细介绍Java8实战视频-40New Date API之format和parse介绍

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧