不会。Java编译器不要求switch必须有default分支,仅当switch表达式为enum类型且未穷举所有枚举常量时才会编译失败;其他类型如String、int等缺default不会报错。
Java switch 缺少 default 会编译失败吗?
不会。Java 编译器不要求
必须有
分支,只要所有可能的
覆盖了
的全部常量,或
表达式类型是已知有限值(如
、
、
、
、
、
),且能证明“控制流不会掉出
”,就允许省略
。
什么时候不写 default 会导致编译错误?
只有一种情况:当
的表达式是
类型,且你没写
,又没穷举该
的所有枚举常量时,编译器会报错
(JDK 14+ 默认启用;老版本需开启
才警告)。
,但
—— 少了
,也无
→ 编译失败
,
是
→ 永远不会因缺
编译失败(字符串值不可穷举)
,
是
→ 同样不会因缺
报错(整数范围无限)
default 分支被优化掉会影响字节码吗?
会。如果编译器能静态确认所有分支已覆盖(比如完整列出
全部值),且存在
,JVM 在生成字节码时可能把
编译成一条无条件跳转(
),甚至直接删掉——但这对行为没影响。真正要注意的是:
加了
但里面只写
,编译器仍可能优化掉该分支的逻辑,但保留异常抛出语义
若未来给
新增一个常量,而旧代码没更新
,运行时就会落到
;没写
则直接编译不过,反而是更早暴露问题
JDK 17+ 的
类配合
(预览特性)也会触发类似检查,但目前仍依赖
或穷举
实际项目里 default 该不该写?
该写,而且建议统一用
这类带上下文的异常。不是为了过编译,而是防漏、助调试:
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
立即学习
“
Java免费学习笔记(深入)
”;
IDE(如 IntelliJ)默认提示“Missing default in switch”并自动补全,关掉它容易埋坑
CI 流程中若开了
或
,缺
可能导致构建失败(尤其在
场景下)
有人会写
(空块),看似“满足语法”,但掩盖了逻辑缺失,比不写还危险
如果是
表达式(Java 14+
表达式语法),则必须确保所有路径都有返回值,此时缺
且未覆盖全量,编译直接报错
最麻烦的不是编译通不过,而是某天加了个新
值,测试没跑全,线上走到
却只打了一行空日志,或者干脆静默吞掉——这种问题查起来比编译错误费十倍力气。
switchdefaultcaseenumswitchbyteshortcharintStringenumswitchdefaultswitchenumdefaultenumerror: enum switch case is missing default-Xlint:switchenum Color { RED, GREEN, BLUE }switch(color) { case RED: ... case GREEN: ... }BLUEdefaultswitch(str) { case "a": ... case "b": ... }strStringdefaultswitch(i) { case 1: ... case 2: ... }iintdefaultenumdefaultdefaultgotodefaultthrow new AssertionError()enumswitchdefaultdefaultsealedswitchdefaultthrow new UnsupportedOperationException("Unexpected value: " + value)-Xlint:all-Werrordefaultenumdefault -> {}switchswitchdefaulterror: switch expression does not cover all possible input valuesenumdefault