2015-01-06 4 views
2

Я получаю время компиляции «код недостижим» ошибка на строке ниже в моей программе:Java время компиляции ошибка код недостижим

System.out.println («я =» + я + «у =» + J);

public static void main(String[] args) { 
    int i = 0, j = 5; 
    tp: for (;;) 
    { 
     i++; 
     for (;;) 
     { 
      if (i > --j) { 
       break tp; 
      } 

     } 
     System.out.println("i =" + i + ", j = " + j); 
    } 
} 

любезно поможет мне найти точную причину этого. Заранее спасибо.

ответ

6

Давайте проанализируем этот код:

tp: for (;;) //<-- similar to while(true) 
    { 
     i++; //increases i by 1 
     for (;;) //<-- similar to while(true) 
     { 
      if (i > --j) { //decreases j and compares its value against i 
       break tp; //breaks tp, which means breaking the outer for loop 
      } 
     } 
     //while(true) above 
     //if break gets executed, it breaks this for loop 
     //so this line can never be executed 
     System.out.println("i =" + i + ", j = " + j); 
    } 

простое решение:

Move System.out.println("i =" + i + ", j = " + j); вне внешнего for цикла.

tp: for (;;) 
{ 
    i++; 
    for (;;) 
    { 
     if (i > --j) { 
      break tp; 
     } 
    } 
} 
System.out.println("i =" + i + ", j = " + j); 
+0

Это еще не доступный код? – Diego

+2

@Diego Нет, потому что внешний цикл может быть выведен, если 'i> --j' становится истинным. – Tom

+1

@Diego не является. Поскольку 'break tp;' get выполняется, внешний цикл 'for' останавливается, поэтому следующий оператор после него, который является' System.out.println (...); ', запускается без проблем. –

3

Код System.out.println невозможен, даже если i больше j. Единственный break отправляет вам breaking из внешнего цикла for. Оператор System.out.println находится после внутреннего цикла for, но во внутреннем цикле for вы либо продолжаете цикл, декременяя j, либо вы break внешний loop. Невозможно найти заявление println.

Чтобы напечатать то, что i и j являются после завершения цикла, переместите System.out.println вызов после концовки скобки внешнего for цикла.

1

внутренний цикл представляет собой бесконечный цикл. Единственный способ выйти из него - это когда i > --j истинно, но это сломает внешний цикл (из-за вызова break tp;), и программа немедленно выполнит следующий код после внешнего цикла. Это означает, что нет никакого условия, когда цикл внутренний заканчивается «нормально», поэтому следующий код после его запуска.

Смежные вопросы