Почему этот код показывает ошибку «недоступный код»?? И как я могу это исправить?

#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 значения есть на каждой итерации.