отключить ошибку компилятора intellij - PullRequest
1 голос
/ 18 марта 2012

Я получаю сообщение об ошибке «Возможно, переменная TMP_1 не инициализирована».Вот фрагмент кода:

10  case 1000:
11       Double TMP_1 = len(T$);
12       I = 1d;
13  case 1001:
14       if (I.compareTo(TMP_1) > 0) {

Об ошибке сообщается в строке 14. В моей программе невозможно перейти к случаю 1001 без выполнения блока кода в случае 1000. Очевидно, что Intellij не может вычислитьэто изКак я могу отключить эту ошибку?Я предпочел бы принять мои изменения с исключением из-за нулевого указателя.

Исходный код был сгенерирован написанным мной компилятором (исходный язык - древний бейсик). Перенос назначения в строке 11 будет очень трудным.

РЕДАКТИРОВАТЬ - см. Объяснение механической улитки ниже.Это совсем не ошибка компилятора;это простая программная ошибка.Проблема заключается в том, что способ, которым я смоделировал оператор GOTO в BASIC, требует, чтобы я оставил оператор switch.И когда я делаю, переменная tmp выходит из области видимости.

Окончательное редактирование - я изменил генератор кода, чтобы полностью удалить переменные TMP.

case 2026:
          V = (asc(V$)) - (asc(" "));
          dataCursor.restore();
          for (J = 1d; J <= ((V * 8d) * 10d); J++) {
               X = dataCursor.read();
          }

Ранее арифметика в цикле for быладелается с использованием переменных tmp, установленных до метки 2026.Теперь, потому что их нет, нет проблем.

1 Ответ

1 голос
/ 18 марта 2012

Компилятор 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) { ... }
        ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...