Могу ли я поместить оператор return внутри оператора switch?

Могу ли я иметь оператор switch который решает, что возвращать? Например, я хочу вернуть что-то другое в зависимости от того, что придумал мой генератор случайных чисел. Eclipse выдает ошибку, требуя, чтобы я поместил оператор return за пределы switch.

Мой код:

public String wordBank() { //Error here saying: "This method must return a type of string"
    String[] wordsShapes = new String[10];
    wordsShapes[1] = "square";
    wordsShapes[2] = "circle";
    wordsShapes[3] = "cone";
    wordsShapes[4] = "prisim";
    wordsShapes[5] = "cube";
    wordsShapes[6] = "cylinder";
    wordsShapes[7] = "triangle";
    wordsShapes[8] = "star";
    wordsShapes[9] = "moon";
    wordsShapes[10] = "paralellogram";

    Random rand = new Random();
    int i = rand.nextInt(11);

    if (i == 0) {
        i = rand.nextInt(11);
    }

    switch (i) {
    case 1:
        return wordsShapes[1].toString();
    case 2:
        return wordsShapes[2].toString();
    case 3:
        return wordsShapes[3].toString();
    case 4:
        return wordsShapes[4].toString();
    case 5:
        return wordsShapes[5].toString();
    case 6:
        return wordsShapes[6].toString();
    case 7:
        return wordsShapes[7].toString();
    case 8:
        return wordsShapes[8].toString();
    case 9:
        return wordsShapes[9].toString();
    case 10:
        return wordsShapes[10].toString();
    }
}

Ответ 1

Извините, но в этом случае почему бы просто не сделать:

return wordsShapes[i].toString();

Таким образом вы можете избежать переключения и всех.

Надеюсь, что это поможет,

Ответ 2

Вы можете поместить return внутрь switch, но в этом случае вам не нужно использовать switch.

Ответ 3

Проблема заключается не в том, что у вас есть операторы return внутри оператора switch, которые совершенно прекрасны, но после оператора switch нет возврата. Если ваш оператор switch завершится без возврата, что произойдет сейчас?

Правила Java требуют, чтобы все пути через возвращающую значение функцию встречались с оператором return. В вашем случае, даже если вы знаете, что значение i всегда будет иметь значение, которое вызовет из этого переключателя return, компилятор Java недостаточно умен, чтобы определить это.

(ASIDE: Кстати, вы фактически не предотвратили создание значения 0, возможно, ваш if должен быть while.)

ДОБАВЛЕНИЕ: В случае, если вас это интересует, вот реализация. См. http://ideone.com/IpIwis для живого примера.

import java.util.Random;
class Main {
    private static final Random random = new Random();

    private static final String[] SHAPES = {
        "square", "circle", "cone", "prism", "cube", "cylinder", "triangle",
        "star", "moon", "parallelogram"
    };

    public static String randomShapeWord() {
        return SHAPES[random.nextInt(SHAPES.length)];
    }

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            System.out.println(randomShapeWord());
        }
    }
}

Обратите внимание на лучшую практику того, что генератор случайных чисел определяется вне функции.

Ответ 4

Оператор return вернется из всей функции, в которой он используется. Поэтому я думаю, что хорошо, что никакие другие полезные строки кода не должны находиться под коммутатором, если вы хотите использовать оператор return в коммутаторе.