Конечная локальная переменная не может быть назначена, не может быть неконечной переменной - PullRequest
0 голосов
/ 28 марта 2019

Я хочу написать код вычисления 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 голосов
/ 28 марта 2019

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

)

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

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

0 голосов
/ 28 марта 2019

Вы можете определить переменные внутри 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] = ...
       }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...