最终局部变量不能赋值,不能赋值给非最终变量

Posted

技术标签:

【中文标题】最终局部变量不能赋值,不能赋值给非最终变量【英文标题】:The final local variable cannot be assigned , cannot to the non-final variable 【发布时间】:2019-08-19 16:58:16 【问题描述】:

我想在这个程序中写bmi计算代码。 当我将变量 "qad1" "vazn1" "bmi" "txtvazn" "txtqad" 和 "txtbmi" 指定为 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);
            
        );
    

【问题讨论】:

【参考方案1】:

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

UPDATE 如@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] = ...
       
 

【讨论】:

在这种情况下不需要final =) @DEADMC,是的,完全正确。感谢您的关注【参考方案2】:

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

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

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

【讨论】:

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

final总结

final关键字以及四个权限修饰符

面向对象二

JAVA中的final关键字

成员变量和局部变量的区别

局部变量和成员变量的区别