Android 为什么这是无法访问的代码?

Android 为什么这是无法访问的代码?,android,while-loop,Android,While Loop,我随机生成一个问题和答案。我想根据用户选择正确答案的情况生成新的随机数组和答案选项。但当我添加一个布尔while循环时,它会显示“无法访问的代码”。。。问题是什么 谢谢 final boolean basadon = false; while(basadon) { Random soru = new Random(); final int[] rastgele = new int[1]; for (int i=0; i<1; i++)

我随机生成一个问题和答案。我想根据用户选择正确答案的情况生成新的随机数组和答案选项。但当我添加一个布尔while循环时,它会显示“无法访问的代码”。。。问题是什么

谢谢

final boolean basadon = false;
    while(basadon)

    {
    Random soru = new Random();
    final int[] rastgele = new int[1];
    for (int i=0; i<1; i++)
            {
                rastgele[i]= soru.nextInt(8);
            }

     ArrayList<Integer> cevap = new ArrayList<Integer>();

     for (int k = 0; k <= 7; ++k) 
        {
            cevap.add(k);               
        }

     final Integer[] rastgele2 = new Integer[4];
                if (rastgele[0]!=cevap.get(0))
                {
                rastgele2[0]=cevap.get(0);
                }
                else
                {
                rastgele2[0]=cevap.get(3);
                }
                if (rastgele[0]!=cevap.get(1))
                {
                rastgele2[1]=cevap.get(1);
                } 
                else
                {
                rastgele2[1]=cevap.get(3);
                }
                if (rastgele[0]!=cevap.get(2))
                {
                rastgele2[2]=cevap.get(2);
                } 
                else
                {
                rastgele2[2]=cevap.get(3);
                }                   
                rastgele2[3]=rastgele[0];
                Collections.shuffle(Arrays.asList(rastgele2)); 



    view.setText(countries.get(rastgele[0]));
    cevap1.setBackgroundResource(heads[rastgele2[0]]);

    cevap1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub              

        if (rastgele[0]==rastgele2[0])
        {
            cevap1.setBackgroundResource(heads[8]);
            countries.remove(rastgele[0]);
            basadon=true;
        }
        else {
            cevap1.setBackgroundResource(heads[9]);

        }
        }
    });
    cevap2.setBackgroundResource(heads[rastgele2[1]]);      
    cevap2.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub              

        if (rastgele2[1]==rastgele[0])
        {
            cevap2.setBackgroundResource(heads[8]);
            countries.remove(rastgele[0]);
            basadon=true;
        }
        else {
            cevap2.setBackgroundResource(heads[9]);

        }
        }
    });
    cevap3.setBackgroundResource(heads[rastgele2[2]]);        
    cevap3.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub              

            if (rastgele2[2]==rastgele[0])
        {
            cevap3.setBackgroundResource(heads[8]);
            countries.remove(rastgele[0]);
            basadon=true;
        }
        else {
            cevap3.setBackgroundResource(heads[9]);

        }
        }
    });
    cevap4.setBackgroundResource(heads[rastgele2[3]]);
    cevap4.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub              

            if (rastgele2[3]==rastgele[0])
        {
            cevap4.setBackgroundResource(heads[8]);
            countries.remove(rastgele[0]);
            basadon=true;
        }
        else {
            cevap4.setBackgroundResource(heads[9]);

        }
        }
    });
    }
    } }
final boolean basadon=false;
while(巴萨顿)
{
Random soru=新的Random();
final int[]rastgele=新int[1];

for(int i=0;i
while(basadon)
始终为false,因此您永远不会进入循环。您真正的意思可能是
while(basadon==false)
。另外,不要将
basalon
声明为
最终布尔值,因为您想稍后修改它的值,这将产生错误。

它可能会抱怨,因为
basadon
已知为
false
并且
while
循环的主体无法到达。您可以通过添加此方法的注释如下:

@SuppressWarnings("unused")
您还可以尝试从
basadon
声明中删除
final
修饰符。这可能会解决问题(但我不确定)


编辑我终于注意到您正试图直接从单击侦听器中修改
basadon
。如果
basadon
final
,这显然不起作用,但是您不能访问局部变量,除非它是
final
。我建议您将
basadon
更改为a(非
final
)字段。那么所有警告和错误都应该消失。

为什么要将所有这些变量声明为final? 例如,如果bsadon需要从false更改为true,它就不能是final。final值就是一个常量,它不会更改。 不要将某些内容声明为final,除非您希望它在程序的整个运行时保持相同的值

你说basadon总是“false”,这就是最终的意思,所以编译器告诉你你永远不会输入while,因为你需要它来计算“true”才能输入


while子句中的between()表达式需要求值为true才能输入代码。

看起来像是从basedon值开始为false,然后在循环中将其设置为true

所以,改变

final boolean basedon = false
while (basedon) {
   ....
}


对于您提出的具体问题:

Why does the compiler give unreachable code warning 
答案是,由于while循环中的条件始终为false,因此while循环中的代码不可能被执行。给出警告是为了表明这一点(考虑到当前的代码情况)您在键入该部分代码时浪费了精力,并且保证永远不会执行该部分代码。若要更正此问题,您可以从basedon中删除最后一个修饰符,并放置一个编程逻辑来设置basedon的值,该值将决定是否进入循环。如果您希望循环始终在运行时放置(true)


但我相信你想问的是如何生成随机问答生成器。为此,你必须发布更大的代码块(看起来你试图在侦听器回调上设置一个循环?).

如果您告诉我们在这堵代码墙的什么地方添加了一个“布尔循环”,那会很有帮助。请看第2行,
while(false)
循环将永远不会以这种方式进入!除此之外,代码行数至少可以减少3或4行…将basedon作为最终版本有什么特殊原因吗?我想在用户选择正确选项时生成新的问题和答案。因此,必须返回开始“Random soru=new Random();”再次:/when I write“while”(basadon=false)“然后它说移除basadon的最后一个修饰语。所以当使用”basadon=true它说再做一次final。//FıratCihangirKırbay
=
,而不是
=
。如果你声明
basadon
为final,你就不允许更改它。因为你打算在循环中修改这个布尔值,你必须删除它前面的单词
final
。但是它说将basadon的修饰符更改为final on“basadon=正确;"也许你在一个静态方法中包含了这些代码。如果是这样的话,试着删除
静态
。抑制警告并不能解决实际问题,即循环从未进入。我删除了它,它说将basadon的修饰符再次更改为final。:/@Juhana-这不一定是一个实际问题。有时是一个问题为了测试的目的想注释掉一段代码(尽管无可否认,使用
if
while
块更为常见)。@FıratCihangirKırbay-我编辑了我的答案,并建议如何处理。
Why does the compiler give unreachable code warning