2015-05-07 2 views
-1

В приведенном ниже коде компилятор Java дает мне ошибку в строке, вызывающей hasAdditionalLiberty, заявив, что x0 и y0 «возможно, не были инициализированы». Я понимаю намерение сделать это ошибкой, но не в этом случае, x0 и y0 должны быть инициализированы, потому что они всегда проходят цикл for?Ошибка Java неинициализированной переменной

Так что же такое правило, определяющее ошибку неинициализированной переменной?

int x0; 
int y0; 
for (int i = 0; i < 4; ++i) { 
    x0 = x + deltaX[i]; 
    y0 = y + deltaY[i]; 
    if (isOnBoard(x0, y0) && at(x0, y0) == Color.Empty) { 
     break; 
    } 
} 
if (!hasAdditionalLiberty(x, y, x0, y0)) { 
    koX = x0; 
    koY = y0; 
} 
+2

Компилятор не всегда может определить, будет ли гарантирован путь к коду.Он не может отличить 'for (int i = 0; i <4; ++ i) {' и 'for (int i = 0; i> 4; ++ i) {', например. – Blorgbeard

+2

Компилятор не проникает так глубоко в поток программы. –

+1

Правила для определения того, была ли назначена переменная определенно [здесь] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-16.html). – Blorgbeard

ответ

1

Ну, компилятор не знает всего о значениях ваших переменных через поток программы.

Затем компилятор не знает, будет ли программа вводить петлю хотя бы один раз, поэтому в этом случае x0 и y0 не будут инициализированы.

Если у вас есть цикл с условием, зависящим от переменной: кто знает это до запуска, если вы войдете в цикл?

В этом случае вы будете иметь неожиданную ошибку в

if (!hasAdditionalLiberty(x, y, x0, y0)) { 
    koX = x0; 
    koY = y0; 
} 

Вы только должны itialize затем

int x0 = -1; 
int y0 = -1; 

или

int x0 = 0; 
int y0 = 0; 

, например.

Да, я знаю, что в вашем случае у вас есть «статический» цикл из-за условия < 4, соя может, если кто-то разработает другой компилятор, чтобы распознать это, у вас не будет этой ошибки.

Для получения дополнительной информации о том, когда вы получаете этот тип ошибок, читайте this.

0

Петля не гарантируется (по мнению составителя), сделали одну итерацию (так как компилятор не делает достаточный анализ выражений цикла в for).

См JLS, Глава 16 для правила отступали неинициализированную переменную ошибки:

The analysis takes into account the structure of statements and expressions […, however] values of expressions are not taken into account in the flow analysis. (My emphasis.)

0

Компилятор не достаточно умен, чтобы знать наверняка, что код будет входить в цикл. Даже если вы можете сказать, что код войдет в цикл, код не сможет. Это не компилятор.

Рассмотрим этот код:

public static void main(String... args){ 
    int x; 
    if(Math.random() < .5){ 
     x = 100; 
    } 
    System.out.println(x); 
} 

Этот код будет генерировать ту же ошибку компилятора, для точно такой же причине.

0

Компилятор не знает, будет ли ваш цикл for определенным образом работать или нет. Чтобы предотвратить предупреждение, просто инициализируйте свои переменные.

int x0 = 0; 
int y0 = 0; 
Смежные вопросы