switch语句中缺少返回语句

6
public AlertStatus nextStatus(){
    int randNum = randNumGen.nextInt(3);
    switch(randNum){
        case 0: return new AlertStatusGreen();
        case 1: return new AlertStatusYellow();
        case 2: return new AlertStatusRed();
        default: System.out.println("ERROR: no random number.");
    }
}

这是我为学校制作程序中一个类中的方法。switch语句使用随机整数来返回一个派生自AlertStatus类的某个类的对象。

但是某些原因导致代码块中最后一行(上面代码中的第9行)出现“missing return statement }” 的错误提示。我不理解为什么会提示这个错误,因为我已经为每种情况都添加了return语句。


6
如果这个数字是4,它会返回什么?(是的,这个数字 不能 是4,但编译器不够聪明以知道这一点) - user253751
除了user253751所说的,有时候编译器无法知道,无论它有多聪明。如果randNumGen的类型是一个interface,并且nextInt(int)是一个抽象方法,那么编译器就不知道nextInt的实际实现。例如,它可能是在运行时解析实现的。 - MC Emperor
2个回答

8
default 情况下,你没有返回任何内容。我认为你想要像这样:
public AlertStatus nextStatus(){
    int randNum = randNumGen.nextInt(3);
    switch(randNum){
        case 0: return new AlertStatusGreen();
        case 1: return new AlertStatusYellow();
        default: return new AlertStatusRed();
        // default: System.out.println("ERROR: no random number.");
    }
}

谢谢!问题解决了。只是想澄清一下,如果我有在 switch 中返回某些东西的情况,那么默认情况下也必须要返回一些东西吗? - Bernandion
@Bernandion 如果你的方法有返回值,那么方法中的每一条可能路径都必须产生一个返回值。它可以是 null,也可以是抛出 Exception 异常。但这并不会为你插入指令。编译器无法确定 nextInt(3) 的返回值是否在范围 0-2 内。 - Elliott Frisch

3

默认情况下必须返回某些内容。如果您想指示错误,则最好抛出异常并指示该错误。

public AlertStatus nextStatus(){
    int randNum = randNumGen.nextInt(3);
    switch(randNum){
       case 0: return new AlertStatusGreen();
       case 1: return new AlertStatusYellow();
       case 2: return new AlertStatusRed();
       default: throw new InvalidArgumentException("invalid argument");
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接