Почему первое условие выражения «else if» всегда ложно? - PullRequest
0 голосов
/ 09 июня 2018

Я предполагаю, что это какая-то логическая ошибка, которую я упускаю из виду, и я надеюсь, что кто-то может объяснить мне механику Java в этом сценарии.Первое условие в операторах if else (id == R.id.checkbox1) выделяется Android Studio как всегда ложное, почему?

@Override
public void onClick(View view) {

    int id = view.getId();
    int page = viewPager.getCurrentItem();
    boolean cBoxChecked = false;

    switch(page) {
        case 0: case 1: case 3: case 4: case 6: case 10:
            if(id == R.id.button2)
                answersStatus.set(page, true);
            else
                answersStatus.set(page, false);
        case 2:
            if(id == R.id.button1)
                answersStatus.set(page, true);
            else
                answersStatus.set(page, false);
        case 5: case 7:
            if(id == R.id.checkbox1 || id == R.id.checkbox4 && cBoxChecked)
                cBoxChecked = true;
                  //____________________
            else if(id == R.id.checkbox1 || id == R.id.checkbox4 && !cBoxChecked)
                  //^^^^^^^^^^^^^^^^^^^^
                answersStatus.set(page, true);
            else
                answersStatus.set(page, false);
        case 8:
            if(id == R.id.checkbox1 || id == R.id.checkbox5 && cBoxChecked)
                cBoxChecked = true;
                  //____________________
            else if(id == R.id.checkbox1 || id == R.id.checkbox5 && !cBoxChecked)
                  //^^^^^^^^^^^^^^^^^^^^
                answersStatus.set(page, true);
            else
                answersStatus.set(page, false);
        case 9:

    }
}

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Вот один из фрагментов кода.

if(id == R.id.checkbox1 || id == R.id.checkbox4 && cBoxChecked)
    cBoxChecked = true;
else if(id == R.id.checkbox1 || id == R.id.checkbox4 && !cBoxChecked)
    answersStatus.set(page, true);
else
    answersStatus.set(page, false);

Оператор then первого if будет выполнен, когда EITHER id == R.id.checkbox1 истинно ИЛИ когда id == R.id.checkbox4 && cBoxChecked истинно.

Так что, если вы доберетесь до else if, это означает, что id == R.id.checkbox1 НЕ МОЖЕТ БЫТЬ истинно.Это то, что говорит компилятор.

В Java (и в большинстве / всех других языках программирования, с которыми я столкнулся) приоритет && выше, чем ||.

Возможно, вы имели в видунаписать это:

if ((id == R.id.checkbox1 || id == R.id.checkbox4) && cBoxChecked)
    cBoxChecked = true;
else if ((id == R.id.checkbox1 || id == R.id.checkbox4) && !cBoxChecked)
    answersStatus.set(page, true);
else
    answersStatus.set(page, false);
0 голосов
/ 09 июня 2018

&& имеет больший приоритет, чем ||

Так что, когда вы пишете следующее утверждение:

if(id == R.id.checkbox1 || id == R.id.checkbox4 && cBoxChecked)

Он проверит либо

id == R.id.checkbox1 

или

id == R.id.checkbox4 && cBoxChecked

Теперь другой оператор if if говорит:

else if(id == R.id.checkbox1 || id == R.id.checkbox4 && !cBoxChecked)

, который снова будет разбит на

id == R.id.checkbox1

или

id == R.id.checkbox4 && !cBoxChecked

Поскольку первое утверждение «id == R.id.checkbox1» одинаково, и всякий раз, когда оно будет истинным, будут вызываться операторы внутри if вместо else if.

Надеюсь, что это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...