为什么无法访问的代码?

时间:2013-07-04 16:39:51

标签: 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++)
            {
                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]);

        }
        }
    });
    }
    } }

5 个答案:

答案 0 :(得分:1)

看起来你基于value开始为false,然后在循环中将其设置为true。

所以,改变

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

boolean basedon = false;
do {
....
} while (basedon);

答案 1 :(得分:0)

while(basadon)始终为false,因此您永远不会进入循环。你的真正含义可能是while(basadon==false)。另外,请勿将basalon声明为final boolean,因为您希望稍后修改其值,这会产生错误。

答案 2 :(得分:0)

这可能是抱怨,因为basadon已知为false,并且无法联系while循环的正文。您可以通过将此注释添加到方法来抑制投诉:

@SuppressWarnings("unused")

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

编辑我终于注意到您正在尝试直接从点击侦听器中修改basadon。如果basadonfinal,那么这显然无效,但除非是final,否则无法访问本地变量。我建议您将basadon更改为封闭类的(非final)字段。然后所有的警告和错误都会消失。

答案 3 :(得分:0)

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

你说basadon总是“假的”,这就是最后的意思,所以编译器告诉你你永远不会输入,因为你需要它来评估“true”才能进入。

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

答案 4 :(得分:0)

根据您提出的具体问题:

Why does the compiler give unreachable code warning 

答案是,由于while循环中的条件总是为false,因此while循环中的代码不可能被执行。警告是为了表明(鉴于当前的代码情况),您已经浪费了您在键入该部分代码上的努力,并且保证永远不会被执行。要纠正这个问题,你可以从basedon中删除最终修饰符并输入一个编程逻辑来设置basedon的值,该值将决定是否进入循环。如果你想让循环始终运行put while(true)。

但我相信你想问的是如何制作随机问答生成器。为此,你必须发布更大的代码块(看起来你试图把一个循环放在一个监听器回调?)并说出你的问题以询问具体的问题(可能发布一个单独的问题)。