введите сюда описание изображения
Я пытаюсь использовать этот формат для оператора переключения, но получаю ошибку в 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)
Как говорится в сообщении об ошибке: в одном операторе switch
вы должны использовать либо старый подход (где метка и операторы разделены двоеточием :
), либо новый подход (где метка и оператор разделены ->
). В вашем случае я бы заменил case 1:
на case 1 ->
и case 2:
на case 2 ->
.
Вы уверены, что IntelliJ не выдает сообщение об ошибке? На моей машине код ошибки подчеркивается красной линией и пишет: «В коммутаторе используются разные типы регистров». Обратите внимание, что Eclipse и IntelliJ используют разные способы сообщения о синтаксических ошибках. IntelliJ делает это сразу же, как только вы вводите код, без необходимости предварительной его компиляции.
Как сказано в спецификации языка Java (docs.oracle.com/javase/specs/jls/se21/html/…): Блок переключения может состоять из следующих элементов: Правила переключения, которые используют ->
для введения либо правила переключения, выражение, блок правила переключения или оператор throw правила переключения; или группы операторов с меткой Switch, в которых используется :
для введения операторов блока с меткой переключателя.
сообщение об ошибке довольно ясно (ИМХО): «Смешивание различных типов операторов case '->' и ':' внутри переключателя не допускается» (кстати, если вы используете помеченные операторы ':', то каждый из них должен заканчиваться на break
или return
, если вы не хотите, чтобы он перешел на следующий)
Как и Eclipse, IntelliJ выдаст ошибку, просто он сделает это по-другому: IntelliJ выдаст ошибку в выводе сборки («java: в переключателе используются разные типы регистров»), а не создаст работоспособную программу, в то время как компилятор Eclipse ecj все равно создаст работоспособную программу, которая завершится с ошибкой во время выполнения в тот момент, когда у вас были синтаксические ошибки (по сути, удаление ошибок из программного кода и замена их/их исключением) (с))..
Обратите внимание: хотя в соответствии с 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");
}
Я НЕ ЗНАЮ. Возможно, смена языка. Возможно, это ошибка в компиляторе Java Eclipse. Eclipse использует собственный компилятор. Intellij, вероятно, тоже. Наверное, не стоит смешивать стили. Я ожидаю, что 1 и 2 провалятся. Что не имеет особого смысла. Но тогда смешение стилей – это не так.