最终的局部变量不能分配,不能分配给非最终变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最终的局部变量不能分配,不能分配给非最终变量相关的知识,希望对你有一定的参考价值。

我想在这个程序中编写bmi计算代码。当我指定变量“qad1”“vazn1”“bmi”“txtvazn”“txtqad”和“txtbmi”作为final时,我遇到了这样的错误:“无法分配最终的局部变量”当我没有将它们指定为final时,我遇到了这个错误:无法引用封闭范围中定义的非最终局部变量。将更改修改为final。我无法用任何技巧解决这个问题。请帮帮我。代码照片上传到这里。谢谢。

public class Shakhes extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.shakhes);

         final EditText txtvazn=(EditText) findViewById(R.id.txtvazn);
         final EditText txtqad=(EditText) findViewById(R.id.txtqad);
         final TextView txtbmi=(TextView) findViewById(R.id.txtbmi);
         Button btnbmi=(Button) findViewById(R.id.btnbmi);
         final int qad1;
         final int vazn1;
         final float bmi;

        btnbmi.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                qad1=Integer.parseInt(txtqad.getText().toString());
                qad1=qad1/100;
                vazn1=Integer.parseInt(txtvazn.getText().toString());
                bmi=vazn1/(qad1*qad1);
                txtbmi.setText(""+bmi);
            }
        });
    }
}
答案

您可以在onClickListener中定义变量,如果只在侦听器中使用它们:

(更新为@DEADMC注意到,在这种情况下不需要更多final

 btnbmi.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            int qad1;
            int vazn1;
            float bmi;

            // all other code

另一方面,如果变量的范围大于侦听器,则将其转换为单项数组:

final int[] qad1 = new int[] {0};

 btnbmi.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
             qad1[0] = ...
       }
 }
另一答案

请首先阅读一些不变性福利(猜测链接http://okyasoft.blogspot.com/2014/05/6-benefits-of-programming-with_5146.html

对于您的示例,请尝试在OnClickListener下创建您尝试使用的所有变量引用 - 作为类字段(而不是方法变量)。

例如,将txtbmi定义为类成员(private TextView txtbmi;)将自动使其可以访问Shakhes活动的所有内部类。

以上是关于最终的局部变量不能分配,不能分配给非最终变量的主要内容,如果未能解决你的问题,请参考以下文章

无法分配最终的局部变量“name”,因为它是在封闭类型中定义的

final 关键字:用来修饰类,方法,成员变量,局部变量

static

C语言中的 局部变量,存储在啥地方?

无法分配给项目,因为它是一个 foreach 迭代变量 [重复]

指针做形参做局部变量以及内存分配