Оператор множественного переключения с использованием заранее/нового типа

введите сюда описание изображения

Я пытаюсь использовать этот формат для оператора переключения, но получаю ошибку в Eclipse, но почему-то не выдает ошибку в IntelliJ. Что необходимо изменить?

public static void main(String[] args) {
    // TODO Auto-generated method stub
    int switchValue = 3;
    
    switch(switchValue) {
    case 1: System.out.println("Value was 1");
    case 2: System.out.println("Value was 2");
    case 3,4,5 ->
    {
        System.out.println("Value was 3");
    }
    
    default -> System.out.println("Was not 1,2,3,4 or 5");
    }
}
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    Mixing of different kinds of case statements '->' and  ':' is not allowed within a switch

    at keywords.Switchhh.main(Switchhh.java:12)

Я НЕ ЗНАЮ. Возможно, смена языка. Возможно, это ошибка в компиляторе Java Eclipse. Eclipse использует собственный компилятор. Intellij, вероятно, тоже. Наверное, не стоит смешивать стили. Я ожидаю, что 1 и 2 провалятся. Что не имеет особого смысла. Но тогда смешение стилей – это не так.

Elliott Frisch 02.09.2024 15:58

Как говорится в сообщении об ошибке: в одном операторе switch вы должны использовать либо старый подход (где метка и операторы разделены двоеточием :), либо новый подход (где метка и оператор разделены ->). В вашем случае я бы заменил case 1: на case 1 -> и case 2: на case 2 ->.

Thomas Kläger 02.09.2024 16:02

Вы уверены, что IntelliJ не выдает сообщение об ошибке? На моей машине код ошибки подчеркивается красной линией и пишет: «В коммутаторе используются разные типы регистров». Обратите внимание, что Eclipse и IntelliJ используют разные способы сообщения о синтаксических ошибках. IntelliJ делает это сразу же, как только вы вводите код, без необходимости предварительной его компиляции.

k314159 02.09.2024 16:04

Как сказано в спецификации языка Java (docs.oracle.com/javase/specs/jls/se21/html/…): Блок переключения может состоять из следующих элементов: Правила переключения, которые используют -> для введения либо правила переключения, выражение, блок правила переключения или оператор throw правила переключения; или группы операторов с меткой Switch, в которых используется : для введения операторов блока с меткой переключателя.

Thomas Kläger 02.09.2024 16:10

сообщение об ошибке довольно ясно (ИМХО): «Смешивание различных типов операторов case '->' и ':' внутри переключателя не допускается» (кстати, если вы используете помеченные операторы ':', то каждый из них должен заканчиваться на break или return, если вы не хотите, чтобы он перешел на следующий)

user85421 02.09.2024 16:27

Как и Eclipse, IntelliJ выдаст ошибку, просто он сделает это по-другому: IntelliJ выдаст ошибку в выводе сборки («java: в переключателе используются разные типы регистров»), а не создаст работоспособную программу, в то время как компилятор Eclipse ecj все равно создаст работоспособную программу, которая завершится с ошибкой во время выполнения в тот момент, когда у вас были синтаксические ошибки (по сути, удаление ошибок из программного кода и замена их/их исключением) (с))..

Mark Rotteveel 02.09.2024 18:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
6
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Обратите внимание: хотя в соответствии с Eclipse вы не можете смешивать типы операторов case в одном и том же блоке переключателей, вы можете смешивать два типа блоков переключателей, если они полностью разделены в коде. Следующие действия работают в Eclipse (Version: 2024-03 (4.31.0)) (хотя я не могу придумать причину для этого).

switch (switchValue) {
    case 1:
        System.out.println("Value was 1");
        break;
    case 2:
        System.out.println("Value was 2");
        break;
    default : {
        switch (switchValue) {
            case 1, 2, 3 -> System.out.println("Value was 3");
            default -> System.out.println("Was not 1,2,3,4 or 5");
        }
    }
}

Смешение различных типов регистровых операторов '->' и ':' недопустимо. разрешено внутри коммутатора

Это похоже на состояния ошибок, не путайте ":" и "->"

switch (switchValue) {
    case 1 -> System.out.println("Value was 1");
    case 2 -> System.out.println("Value was 2");
    case 3, 4, 5 -> System.out.println("Value was 3");
    default -> System.out.println("Was not 1,2,3,4 or 5");
}

Другие вопросы по теме

HTML/JS Попытка циклически переключать параметры шрифта на веб-сайте с помощью переключателя, но он не работает
Система оценок с использованием оператора switch
Построение «системы оценок» школы с использованием управляющего оператора «switch»
Переключатели С++ Возврат внутри/вне скобок? перерыв?
Я пытаюсь создать систему управления библиотекой и не понимаю, почему в случае переключения также есть цикл с оператором прерывания
Использование выражения переключения C# с вводом массива
Как воспроизвести поведение сопоставления шаблонов в операторе переключения C# 4? Функция «сопоставление шаблонов» недоступна в C# 4
Напишите метод, который принимает 3 целых числа в качестве параметров, возвращает true, если они равны, в противном случае возвращает false, не используя оператор if
Как я могу использовать измененную строку в операторе C# switch → case?
Существует ли прагматичное решение для удаления переключателей перечисления?