编译器无法知道它总是Assert.fail
会抛出异常,除非它要深入研究该方法的字节码并对其进行某种静态分析(一旦你开始这种事情,你会在哪里停止?) . Java 语言规范声明(第 8.4.7 节)
如果将方法声明为具有返回类型,则如果方法的主体可以正常完成(第 14.1 节),则会发生编译时错误。
您的示例中的“可以正常完成”归结为(第 14.21 节)
一个不是 switch 块的非空块可以正常完成,前提是它的最后一条语句可以正常完成。
您方法中的最后一个语句是一个switch
语句:
如果以下至少一项为真,则 switch 语句可以正常完成:
[...]
中的最后一条语句switch
是表达式语句(方法调用)
一个表达式语句可以正常完成,只要它是可达的。
即规范明确规定编译器不应该查看任何方法调用内部,并且任何方法调用表达式必须被认为是可以正常完成的。
同一部分还定义了
, break
, continue
, return
orthrow
语句不能正常完成。
因此,为了让编译器满意,您需要在方法的末尾添加 return 或 throw
// will never be reached
throw new Error();
我个人会尝试一下,并发表评论解释说,如果达到这条线,就会出现非常错误的情况......