Попытка JDK / 12 EarlyAccess Build 20 , где Выражения переключателя JEP-325 были интегрированы в качестве функции предварительного просмотра.Пример кода для выражений (как и в JEP):
Scanner scanner = new Scanner(System.in);
Day day = Day.valueOf(scanner.next().toUpperCase());
int i = switch (day) {
case MONDAY,TUESDAY, WEDNESDAY:
break 0;
default:
System.out.println("Second half of the week");
// ERROR! Group doesn't contain a break with value
};
Я пытался выполнить ту же процедуру, что и в предыдущем вопросе о том, как скомпилировать функцию предварительного просмотра JDK12 сMaven и выполните приведенный выше блок кода с помощью командной строки:
java --enable-preview -jar target/jdk12-updates-1.0.0-SNAPSHOT.jar
В некоторой степени, к моему ожиданию, я получил следующую ошибку:
Error: Unable to initialize main class
com.stackoverflow.nullpointer.expression.SwitchExpressionMustComplete
Caused by: java.lang.VerifyError: Bad local variable type Exception
Details: Location:
com/stackoverflow/nullpointer/expression/SwitchExpressionMustComplete.main([Ljava/lang/String;)V @66: iload
Reason:
Type top (current frame, locals[4]) is not assignable to integer
Current Frame:
bci: @66
flags: { }
locals: { '[Ljava/lang/String;', 'java/util/Scanner', 'com/stackoverflow/nullpointer/Day' }
stack: { }
Bytecode:
0000000: bb00 0259 b200 03b7 0004 4c2b b600 05b8
0000010: 0006 4db2 0007 2cb6 0008 2eaa 0000 001f
0000020: 0000 0001 0000 0003 0000 0019 0000 0019
0000030: 0000 0019 0336 04a7 000b b200 0912 0ab6
0000040: 000b 1504 3eb1
Stackmap Table:
append_frame(@52,Object[#2],Object[#34])
same_frame(@58)
same_frame(@66)
Мне известно, что в документе указывается, что код является ошибочным, и замена комментария на break 1;
устраняет его, но у меня есть следующие вопросы:
Q1. Почему фаза компиляции проходит одинаково? Разве это не должно произойти во время самой компиляции?
Q2.В чем причина такого подробного сообщения об ошибке? Может ли функция --enable-preview
отвечать за это?