Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法指定最终局部变量,因为它是在封闭类型中定义的?_Java_Android_Variables - Fatal编程技术网

Java 无法指定最终局部变量,因为它是在封闭类型中定义的?

Java 无法指定最终局部变量,因为它是在封闭类型中定义的?,java,android,variables,Java,Android,Variables,希望能够在最后创建一个变量,该变量具有时间和成本的值,我最终将在TextView中显示该值。但是我的ints遇到了问题 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState);

希望能够在最后创建一个变量,该变量具有时间和成本的值,我最终将在TextView中显示该值。但是我的ints遇到了问题

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final int intTime = 30;
    final int intCost = 10;

    CheckBox CP = (CheckBox)findViewById(R.id.checkPepperoni);
    CheckBox CS = (CheckBox)findViewById(R.id.checkSausage);
    CheckBox CB = (CheckBox)findViewById(R.id.checkBacon);
    CheckBox CM = (CheckBox)findViewById(R.id.checkMushroom);

    final ImageView cheese =(ImageView)findViewById(R.id.imgCheese);
    final ImageView pepperoni =(ImageView)findViewById(R.id.imgPepperoni);
    final ImageView sausage =(ImageView)findViewById(R.id.imgSausage);
    final ImageView bacon =(ImageView)findViewById(R.id.imgBacon);
    final ImageView mushroom =(ImageView)findViewById(R.id.imgMushroom);

    final SharedPreferences sharedPref =PreferenceManager.getDefaultSharedPreferences(this);



    CP.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
                        //Pepperoni Listener
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked1) {
            // TODO Auto-generated method stub

                  if(isChecked1){                       

                      pepperoni.setImageResource(R.drawable.pepperoni);
                      intTime = intTime + 6;
                      intCost = intCost + 5;
                    }
                   else{

                        pepperoni.setImageResource(0);
                        intTime = intTime - 6;
                        intCost = intCost - 5;
                   }

    }});

    CS.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
                    //Sausage Listener
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked2) {
            // TODO Auto-generated method stub

                  if(isChecked2){                       

                      sausage.setImageResource(R.drawable.sausage);
                      intTime = intTime + 6;
                      intCost = intCost + 5;

                    }
                   else{

                       sausage.setImageResource(0);
                       intTime = intTime - 6;
                        intCost = intCost - 5;

                   }

    }});

    CB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked3) {
            // TODO Auto-generated method stub

                  if(isChecked3){                       

                      bacon.setImageResource(R.drawable.bacon);
                      intTime = intTime + 6;
                      intCost = intCost + 5;

                    }
                   else{

                       bacon.setImageResource(0);
                       intTime = intTime - 6;
                        intCost = intCost - 5;

                   }

    }});

    CM.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked4) {
            // TODO Auto-generated method stub

                  if(isChecked4){                       

                      mushroom.setImageResource(R.drawable.mushroom);
                      intTime = intTime + 6;
                      intCost = intCost + 5;

                    }
                   else{

                       mushroom.setImageResource(0);
                       intTime = intTime - 6;
                        intCost = intCost - 5;

                   }

    }});


    ImageButton IB = (ImageButton)findViewById(R.id.imgBtnGo);
    IB.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            String time = Integer.toString(intTime);
            String cost = Integer.toString(intCost);

            SharedPreferences.Editor editor = sharedPref.edit();
            editor.putString("keyTime", time);
            editor.putString("keyCost", cost);

            startActivity(new Intent(MainActivity.this, ResultActivity.class));

        }

    });
}

}
我遇到的错误是,“无法分配最终的局部变量intCost,因为它是在封闭类型中定义的。”


这意味着什么?有没有任何方法可以使用所有复选框更改此变量?

问题的原因是
最终的
变量应该在声明时初始化,并且不能重新分配。这种情况下最好的办法是在匿名类中创建以最终变量值开头的内部字段,并且该内部字段会定期更新

例如:

CP.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    //Pepperoni Listener
    int innerTime = intTime;
    int innerCost = intCost;

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked1) {
        if(isChecked1) {
            pepperoni.setImageResource(R.drawable.pepperoni);
            innerTime += 6;
            innerCost += 5;
        } else {
            pepperoni.setImageResource(0);
            innerTime -= 6;
            innerCost -= 5;
        }
    }
});
更多信息:


我不知道你为什么要使用midficator
final
首先,如果你只是删除它,你的代码会工作得很好,我不确定,但我已经检查了
onClick
,它工作得很好。只要把它们做成字段,就可以了

你能给我举个例子看看会是什么样子吗?我不太明白你所说的“匿名类”和“内部字段”是什么意思。这可能不适用于OP,因为对内部变量的更新对其他人来说是不可见的。最终,它成为了最终版本,并将其置于“受保护的空区”之外,现在它似乎工作得非常好。它不会。在Java中,除非变量是
final
,否则不能在匿名类中直接使用方法中的变量。为什么不让它们成为类字段而不是局部变量?删除final会产生错误“无法引用在封闭范围中定义的非终定局部变量intTime”。这是OP的设计,不是我的设计。我只是想解决这个问题。@joey和Nik达成一致,删除
final
,并将它们移动到实例变量。你知道
final
的意思吗?