Компилятор Java не достаточно умен, чтобы доказать, что переменная, которую вы включаете, никогда не будет 1001
до тех пор, пока не будет выполнен код, который инициализирует переменную.Помните, что объявления переменных Java полностью статичны;По своему дизайну Java позволяет использовать вашу переменную только в тех случаях, которые имеют смысл, то есть инициализируются перед использованием.И доказательство того, что это происходит для общего кода, эквивалентно решению проблемы остановки.(Из всего, что знает компилятор, выражение I.compareTo(TMP_1) > 0
может быть бессмысленным, поскольку оно ссылается на несуществующую переменную. (Точнее, переменная объявлена в области видимости тела оператора switch
,но код, который его инициализирует, не будет выполнен, если вы перейдете к метке case 1001:
.))
Вы не можете превратить эту ошибку в предупреждение;это один из недостатков статического языка.В частности, * Спецификация языка Java , глава 16 , требует:
Для каждого доступа к локальной переменной [...] x, x должен быть определенно назначен перед доступом,или происходит ошибка времени компиляции.
и переменная не «определенно назначена» (как определено в спецификации) перед доступом.IntelliJ компилирует ваш код, используя компилятор Java (обычно javac).Поскольку то, что вы пытаетесь сделать, по стандарту должно быть ошибкой, то, что вы хотите, невозможно (если не отредактировать компилятор, и тогда это больше не будет Java).
Обходной путь
Вместо этого просто объявите вашу переменную в окружающей области и инициализируйте ее фиктивным значением.Например:
Double TMP_1 = null;
while(exitVar) {
switch(lblToGoTo) {
...
case 1000:
TMP_1 = len(T$);
I = 1d;
case 1001:
if (I.compareTo(TMP_1) > 0) { ... }
...
}
}