当前位置: 首页 > 知识库问答 >
问题:

开关(枚举)后的“缺少返回语句”-为什么?

姬歌者
2023-03-14

编译器声称在 MyClass.parse() 的末尾缺少一个返回语句。代码如下:

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并且所有枚举都包含在开关语句中,在任何情况下返回语句都会离开方法。myEnum不能是null,因为@NonNull方法MyEnum.parse()如果结果是null,则会引发异常。

如果没有,你会用< code > return null//never behind 标记方法的(希望)不可到达的一端,还是抛出一个< code>AssertionError?

共有1个答案

琴俊人
2023-03-14

编译器正确吗?

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

< code>myEnum不能为< code>null,因为如果结果为< code>null,则< code>@NonNull方法< code>MyEnum.parse()会引发异常。

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

如果没有,你会用< code > return null//never behind 标记方法的(希望)不可到达的一端,还是抛出一个< code>AssertionError?

抛出一个< code>AssertionError是非常常规的。或者,考虑在枚举常量中嵌入条件逻辑,而不是使用开关。

 类似资料:
  • 问题内容: 为什么这给了我一个丢失的退货陈述错误?每个if / else都有返回值,最后一个括号出现错误 问题答案: 每个语句都在一个语句内。虽然从逻辑上讲这是不可能的,但是当所有评估都不为真时,编译器需要返回。 我建议: 我认为,此解决方案可解决编译器问题并稍微提高可读性。 或者,有以下解决方案: 引发异常将使你可以退出方法而无需返回任何信息……因为可以说,如果到达最后一个,显然会出错。

  • 我有一个二维布尔数组“poorSignal”,需要编写一个返回网格的方法,如果数组上的一个点为真,则显示X,如果为假,则显示O。这是我的代码: 当我编译时,它在方法的最后一行给出了“missing return statement”。我也不确定“return”\n在打印阵列时是否可以添加新行。 这是一个赋值问题,所以我不能直接打印它,也不能只打印布尔值——它必须是一个生成网格的方法。

  • 我在类中使用下面的代码,允许用户设置声明的的第一点、第二点或第三点。 编译器告诉我: 但是我认为catch语句的目的是能够捕获错误并返回描述错误的字符串,而不必担心匹配函数的返回类型。

  • 关于或语句中使用的返回语句,我有一个问题。 正如您在下面的方法中所看到的,它期望I

  • 下面的Java不工作,因为它缺少一个return语句。我搞不懂怎么了。有什么想法吗? 即使我去掉字符串u,它也会给出相同的错误,如果我添加int usernameLimit,它也会给出相同的错误。

  • 我正在运行这段java代码,遇到一个错误“缺少返回语句”,请帮助。我在windows中使用cmd运行。