Java / Android Studio / If оператор не выполняется, несмотря на то, что он соответствует условию - PullRequest
0 голосов
/ 20 октября 2019

Я программировал десятилетиями и использовал много разных языков. В настоящее время я делаю простое Java-приложение для курса Uni. Курсовая работа проста, но у меня возникла проблема с оператором if, который просто не желает выполняться, даже если он соответствует условию.

Я собираюсь признать, что мне немного неловко задавать такой простой вопрос, но это проблема, которую я потратил больше времени, которое, как мне кажется, я пытаюсь решить.

РазрешитьМне бы уточнить:

У меня есть две переменные, одна частная локальная и одна сгенерированная, обе определены как int . _selectedImage и clickedImageID , оба предоставляются функции public void , которая проверяет, совпадают ли они. При первом запуске приложения они будут одинаковыми, каждый раз при запуске функции это не так.

Однако, что бы я ни делал, оно просто не хочет выполнять блок if. Позвольте мне продемонстрировать:

private int _selectedImage;

public void setPuzzlePiece(int clickedImageID) {
 // selectedImage == clickedImageID on first run.
 Boolean firstRun = (clickedImageID == _selectedImage);
 if (firstRun==false) {
  // do stuff
  String debugPoint = "adding this here just to attach a debug point";
 }
}

Я предоставил скриншот из процесса отладки, который выделяет значения:

https://i.imgur.com/ahgNZLP.png

Вы увидите соответствующие значения 4 и 5 , оба int , для clickedImageID и _selectedImage , тогда как firstRun равно false .

Определите, как, несмотря на выполнение условия, отладчик считает, что в строке 77 не найдено исполняемого кода, и, проходя через отладчик, он просто «игнорирует» условие if. Все же мы все можем видеть логику, совершенно ясно, что он должен выполнить блок.

У меня изначально было это как простое сравнение. if (_selectedImage==clickedImageID) { .. } Но изменили условие на логическое и сравнили с этим. Я также пробовал многочисленные способы обнаружения ложных, такие как (firstRun==false), (!firstRun) и (firstRun==(!true)) среди многих других глупых способов, но это настолько просто, насколько просто может быть, достаточно просто сравнить логическое значение с истинным или ложным.

Если я использую окно оценки, оно возвращает то, что показывает скриншот, что условие блока if выполнено, но оно все равно не будет выполнено.

Это может быть связано с Javaи это сравнения. Поскольку я использую несколько языков, я иногда могу быть пойман с недостатками каждого из них;например, в c # вы можете сравнивать строки через ==, в то время как в Java вы используете equals ().

Это должно быть что-то, что я делаю не так, но я не могу этого увидеть. Помогите мне определить мою глупость ТАК!

  • ps: я проверил, является ли это дублирующим вопросом, и хотя несколько потоков относятся к аналогичным, они находятся на PHP или C ++, а не на Java, иJava - это простая синтаксическая ошибка, которая их подвела. Это, как я вижу, не проблема здесь. *

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 20 октября 2019

Так что я буду честен здесь, я действительно не понимаю, что происходит, я переписал свою функцию (сохраняя то же имя и аргументы) к этому ..

    public void setPuzzlePiece(int clickedImageID) {
            boolean areEqual = (clickedImageID == _selectedImage);
            if (!areEqual) {
                System.out.print("they are equal");
            }
    }

.. и все же, о чудо, теперь он выполняет блок if, когда !areEqual. Если кто-то захочет указать, почему этот код выше работает, а код, который я разместил в моем OP, не будет, то я был бы от всей души благодарен, поскольку я хотел бы не сталкиваться с этой проблемой снова.

Я должен указатьЯ не сделал ничего, кроме как в IDE, удалил содержимое функции (сохранив определение) и заменил firstRun на areEqual.

Является ли firstRun каким-то образом встроенным в систему Android? Вы ожидаете, что компилятор поднимет эту проблему, но, как мне кажется, проблема здесь.

0 голосов
/ 20 октября 2019

Он работает на моем компьютере ... Когда я запускаю этот код, он достигает оператора печати. ​​

 public static void main(String[] args) {
    setPuzzlePiece(3);

}

private static int _selectedImage = 1;

public static void setPuzzlePiece(int clickedImageID) {
    // selectedImage == clickedImageID on first run.
    Boolean firstRun = (clickedImageID == _selectedImage);
    if (firstRun == false) {
        // do stuff
        System.out.println("adding this here just to attach a debug point");
    }
}
0 голосов
/ 20 октября 2019

Попробуйте напечатать значение firstRun с помощью firstRun.toString ();вне если заявление. а также значения clickedImageID и _selectedImage с использованием метода toString ().

0 голосов
/ 20 октября 2019

Можете ли вы поделиться более подробной информацией о вопросе или вставить весь код здесь, в разделе вопросов.

Я использовал почти тот же код, и он отлично работает для меня.

class Test{
    private static int _selectedImage;

    public static void setPuzzlePiece(int clickedImageID) {
        Boolean firstRun = (clickedImageID == _selectedImage);
        if (firstRun == false) {
            String debugPoint = "adding this here just to attach a debug point";
            System.out.println(debugPoint);
        }
    }

    public static void main(String[] args) throws java.lang.Exception {
        _selectedImage = 10;
        setPuzzlePiece(11);
    }
}

Вывод - добавив это здесь, просто чтобы присоединить точку отладки

Попробуйте перезагрузить вашу IDEили лишить законной силы кэш.

...