无法将最终的局部变量赋值,也不能将其分配给非最终变量

时间:2019-03-28 19:48:26

标签: java android eclipse

我想在该程序中编写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);
            }
        });
    }
}

2 个答案:

答案 0 :(得分:0)

如果仅在侦听器中使用变量,则可以在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] = ...
       }
 }

答案 1 :(得分:0)

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

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

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