Конечная локальная переменная не может быть присвоена, не может быть присвоена не окончательной переменной

#java #android #eclipse

#java #Android #eclipse

Вопрос:

Я хочу написать код расчета 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);
            }
        });
    }
}
  

Ответ №1:

Вы можете определить переменные внутри onClickListener , если используете, используйте их только внутри listener:

(ОБНОВЛЕНИЕ, как отметил @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. в этом случае final не нужен =)

2. @DEADMC, да, точно. Спасибо за примечание

Ответ №2:

Пожалуйста, в первую очередь ознакомьтесь с преимуществами неизменяемости (угадайте ссылку http://okyasoft.blogspot.com/2014/05/6-benefits-of-programming-with_5146.html )

Для вашего примера, пожалуйста, попробуйте сделать все ссылки на переменные, которые вы пытаетесь использовать в OnClickListener — в качестве полей класса (вместо переменных метода).

Определение, например, txtbmi как члена класса ( private TextView txtbmi; ) автоматически сделает его доступным для всех внутренних классов вашей Shakhes деятельности.