gpt4 book ai didi

java - 开关(枚举)后 "Missing return statement"- 为什么?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:52:54 25 4
gpt4 key购买 nike

编译器声称 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 {
}

编译器对吗? (安卓工作室)

如果是这样,在什么情况下可以到达方法的结尾?我认为 myEnum 不能是 null 并且所有枚举都包含在 switch 语句中,在任何情况下 return 语句都会离开该方法。 myEnum 不能为 null 因为 @NonNull 方法 MyEnum.parse() 在结果为

如果不是,您是否会用 return null//should never be reached 标记方法的(希望如此)无法到达的结尾,或者抛出 AssertionError

最佳答案

Is the compiler right?

是的,因为它不会在编译时验证枚举覆盖率。假设枚举存在于另一个二进制文件中,并且用一个新常量更新了它。该方法会返回什么?

myEnum cannot be null because the @NonNull method MyEnum.parse() throws an exception if the result is null.

编译器不够聪明,无法解决这个问题(尽管您的 IDE 可能是)。但这是一个有争议的问题,因为打开 null 会导致 NPE。

If not, would you mark the (hopefully) unreachable end of the method with return null // should never be reached or throw an AssertionError?

抛出一个 AssertionError 是非常传统的。或者,考虑 embedding conditional logic in the enum constants而不是使用开关。

关于java - 开关(枚举)后 "Missing return statement"- 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50142787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com