编译器声称在 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?
编译器正确吗?
是的,因为它在编译时不验证枚举覆盖率。假设枚举存在于另一个二进制文件中,并且它被更新为一个新常量。该方法会返回什么?
< 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运行。