方法返回一个值,但编译器指示缺少返回值

时间:2018-02-23 21:34:41

标签: java

我正在返回所有继承自TestTimes类的排序类的实例。

然而,当我返回实例时,我收到一个错误,说我需要返回TestTimes类型的结果。

它还说:“缺少'默认:'开关''已被抑制,”这可能与此问题有关?

public TestTimes runSort(SortType sortType, ArrayType arrayType, int arraySize, int numberOfTimes) {

    switch (sortType) {
        case BubbleSort :
            BubbleSort bs = new BubbleSort();
            switch (arrayType) {
            case Increasing :
                for(int i = 0; i < numberOfTimes; i++)
                    bs.sort(createArray(arrayType, arraySize));
                break;
            case Random : 
                for(int i = 0; i < numberOfTimes; i++)
                    bs.sort(createArray(arrayType,arraySize));
                break;

            }
            return bs;

        case InsertionSort: 
            InsertionSort is = new InsertionSort();
            switch (arrayType) {
            case Increasing:
                for(int i = 0; i < numberOfTimes; i++)
                is.sort(createArray(arrayType, arraySize));
                break;
            case Random:
                for(int i = 0; i < numberOfTimes; i++)
                    is.sort(createArray(arrayType, arraySize));
                break;


            }
        return is;
    }
}

1 个答案:

答案 0 :(得分:0)

所有&#34;逻辑&#34;通过方法的路径需要根据方法的合同返回。在您的情况下,您有一个switch语句,但只定义了两个显式情况而没有默认情况。这就像拥有if - else if而没有else - 如果您不满足任何条件会怎么样?

简化,你有类似的东西:

public SomeType doSomething(SomeEnum enumValue) {
    switch(enumValue) {
        case SomeEnum.FOO:
            // do something
            return something;
        case SomeEnum.BAR:
            // ...
            return something;
    }

    // But what if enumValue is neither? We end up here ... with no return!
}

如果你的枚举不是这些值中的任何一个怎么办?

这是您的编译器试图告诉您的内容。现在,如果这些是唯一受支持的值,您可能希望抛出类似IllegalArgumentException的异常来指示错误的输入。或者您可能想要返回null或不同的指示符。

这就是为什么抑制与交换机相关的编译器警告错过默认情况并不好的原因 - 因为它经常表明,就像你在这里一样,逻辑中缺少路径。此外,如果您在某些时候为您的枚举添加新类型的搜索,该怎么办?即使你现在只支持冒泡和插入排序,也许你以后想要支持Radix排序,但是方法中还没有处理它。

您应该在交换机中添加default个案,或者在方法的底部添加一个明确的returnthrows来处理您不知道的堕落案例。 ; t明确支持

例如,使用default

switch(sortType) {
    case BubbleSort:
        return ...;
    case InsertionSort:
        return ...;
    default:
        throw new IllegalArgumentException("Only BubbleSort and InsertionSort supported!");
}

或者,或者通过明确的回报:

public TestTimes runSort (...) {
    switch(sortType) {
      case BubbleSort:
          return ...;
      case InsertionSort:
          return ...;
    }
    // we'll end up here with any other sort type...
    return null; // or throw new Exception(...) etc
}