【问题标题】:Why this code is showing "unreachable code" error?? And how can I fix it?为什么此代码显示“无法访问的代码”错误?我该如何解决?
【发布时间】:2021-04-25 16:50:29
【问题描述】:
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 && i<j) {
                while(arr[j]<0 && 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
        }
    }
}

为什么此代码显示“无法访问代码”错误? 我该如何解决?请问这个错误怎么解决?

【问题讨论】:

  • 你有一个无限循环while(true),无法摆脱它;您希望如何到达下面的for 循环?如果您打算将break 语句从最外层循环中退出,则需要使用带标签的break。
  • 附带说明,我强烈建议即使是单语句循环/if 主体也使用大括号。

标签: java unreachable-code


【解决方案1】:

都是因为这行代码:

    while(true) 

for 循环上的其余代码将变得无法访问,因为第一个 while 循环无法终止,从而导致您的程序在无限循环中运行

无法访问的代码:

for(int x=0;x<arr.length;x++) {
    System.out.print(arr[x]+" "); //unreachable code
}

要解决此问题,您需要为 first while 条件设置一个变量,该变量会在满足条件后以某种方式更改值。根据您的代码,您可以将其放在代码的 else 部分:

boolean run = true;
while(run) {
        while(arr[i]>0 && i<j) {
            while(arr[j]<0 && i<j) {
                if(i<j) {
                    int temp=arr[i];
                    arr[i]=arr[j];
                    arr[j]=temp;
                    i++;
                    j--;
                } else {
                     run = false; 
                     break;
                 }
            }
            
        }
}

【讨论】:

  • 请注意,break 的目的是立即离开所有循环;您的建议仍将继续通过while(arr[j]&lt;0 &amp;&amp; i&lt;j)while(arr[i]&gt;0 &amp;&amp; i&lt;j)
【解决方案2】:

break 离开它所在的最近的最内层循环,在您的情况下为while(arr[j]&lt;0 &amp;&amp; i&lt;j)。这意味着您的while(true) 是一个无限循环。

您可以通过维护将触发外部中断的标志来解决此问题:

boolean goOn = true;
while(goOn) 
    while(goOn && arr[i]>0 && i<j) {
        while(goOn && arr[j]<0 && 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 && i<j) {
        while(arr[j]<0 && 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中很少使用的特性。

【讨论】:

  • @Saksham 您需要将if(i &lt; j) 支票移到更远的地方。由于同样的检查在while-conditions 中,它永远不会达到它当前的位置。最好使用调试器查看ij 在每次迭代中的值。
猜你喜欢
  • 2012-04-11
  • 2016-08-03
  • 2022-11-24
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
相关资源
最近更新 更多