切换后的“缺少退货声明”(枚举) – 为什么?
编译器声称在MyClass.parse()
末尾缺少return语句。 这是代码:
package de.hs_rm.safelyovertaken.ble; import android.support.annotation.NonNull; import java.util.Arrays; class MyClass { @NonNull static MyClass parse(byte[] encoded) throws MyParseException { MyEnum myEnum = MyEnum.parse(Arrays.copyOfRange(encoded, 0, 2)); switch (myEnum) { case A: return new MyClassA(); case B: return new MyClassB(); case C: return new MyClassC(); } // compile error: "Missing return statement" // return null; // should never be reached // throw new AssertionError("Should never be reached"); } } enum MyEnum { A, B, C; @NonNull static MyEnum parse(byte[] encoded) throws MyParseException { MyEnum result = null; // parse logic here if (result == null) { throw new MyParseException(); } return result; } } class MyParseException extends Exception { } class MyClassA extends MyClass { } class MyClassB extends MyClass { } class MyClassC extends MyClass { }
编译器是对的吗? (Android Studio)
如果是这样,在什么情况下可以达到方法的结束? 我认为myEnum
不能为null
并且switch语句中包含所有枚举,其中return语句将离开该方法。 myEnum
不能为null
因为@NonNull
方法MyEnum.parse()
如果结果为null
则抛出exception。
如果没有,你是否会标记方法(希望)无法访问的方法, return null // should never be reached
或抛出AssertionError
?
编译器是对的吗?
是的,因为它在编译时不validation枚举覆盖率。 假设枚举存在于另一个二进制文件中,并使用新常量进行更新。 该方法会返回什么?
myEnum
不能为null
因为@NonNull
方法MyEnum.parse()
如果结果为null
则抛出exception。
编译器不够聪明,无法解决这个问题(尽管你的IDE可能是这样)。 但这是一个没有实际意义的点,因为切换为null
会导致NPE。
如果没有,你是否会标记方法(希望)无法访问的方法,
return null // should never be reached
或抛出AssertionError
?
抛出AssertionError
非常传统。 或者,考虑在枚举常量中嵌入条件逻辑而不是使用开关。