#java #unreachable-code
#java #недоступный-код
Вопрос:
public class Array {
public static void main(String[] args) {
int[] arr= {5,6,9,-5,-2,4,-3,1,-1};
int i=0;
int n=arr.length;
int j=n-1;
while(true)
while(arr[i]>0 amp;amp; i<j) {
while(arr[j]<0 amp;amp; i<j) {
if(i<j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
i ;
j--;
}else
break;
}
}
for(int x=0;x<arr.length;x ) {
System.out.print(arr[x] " "); //unreachable code
}
}
}
Почему этот код показывает ошибку «недоступный код»?
И как я могу это исправить? как я могу решить эту ошибку, пожалуйста, помогите?
Комментарии:
1. У вас бесконечный цикл
while(true)
, из которого нет выхода; как вы ожидаетеfor
, что цикл ниже должен быть достигнут? Если вы намереваетесьbreak
завершить оператор из самого внешнего цикла, вам нужно использовать помеченный разрыв.2. В качестве примечания я настоятельно рекомендую использовать фигурные скобки даже для тел цикла с одним оператором / if.
Ответ №1:
Это все из-за этой строки кода:
while(true)
Остальная часть кода в цикле for станет недоступной, потому что невозможно завершить первый цикл while, что приведет к тому, что ваша программа будет выполняться в бесконечном цикле
Недоступный код:
for(int x=0;x<arr.length;x ) {
System.out.print(arr[x] " "); //unreachable code
}
Чтобы исправить это, вам нужно установить переменную для первого условия while, которая каким-то образом изменит значение при выполнении условия. Основываясь на вашем коде, вы можете поместить его в else
часть вашего кода:
boolean run = true;
while(run) {
while(arr[i]>0 amp;amp; i<j) {
while(arr[j]<0 amp;amp; i<j) {
if(i<j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
i ;
j--;
} else {
run = false;
break;
}
}
}
}
Комментарии:
1. Обратите внимание, что цель
break
состоит в том, чтобы немедленно покинуть все циклы; то, что вы предлагаете, все равно будет продолжать проходитьwhile(arr[j]<0 amp;amp; i<j)
иwhile(arr[i]>0 amp;amp; i<j)
.
Ответ №2:
break
в вашем случае оставляет ближайший самый внутренний цикл, в котором он находится while(arr[j]<0 amp;amp; i<j)
. Это означает, что ваш while(true)
цикл бесконечен.
Вы можете исправить это, либо сохранив флаг, который вызовет внешний разрыв:
boolean goOn = true;
while(goOn)
while(goOn amp;amp; arr[i]>0 amp;amp; i<j) {
while(goOn amp;amp; arr[j]<0 amp;amp; i<j) {
if(i<j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
i ;
j--;
}else {
goOn = false;
break;
}
}
}
for(int x=0;x<arr.length;x ) {
System.out.print(arr[x] " "); //unreachable code
}
или создайте метку и break
там:
while(true)
while(arr[i]>0 amp;amp; i<j) {
while(arr[j]<0 amp;amp; i<j) {
if(i<j) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
i ;
j--;
}else {
break exit;
}
}
}
exit:
for(int x=0;x<arr.length;x ) {
System.out.print(arr[x] " "); //unreachable code
}
Последняя функция редко используется в Java.
Комментарии:
1. @Saksham Вам нужно переместить
if(i < j)
проверку дальше за пределы. Поскольку та же проверка выполняется вwhile
-conditions , она никогда не достигнет точки, в которой она находится в данный момент. Лучше всего использовать отладчик, чтобы увидеть, какие значенияi
иj
значения есть на каждой итерации.