Java .contains () ведет себя не так, как я ожидал - PullRequest
0 голосов
/ 06 июля 2018

У меня проблема, когда .contains() не возвращает true при поиске подстроки.

См. Фрагмент кода ниже и изображение, на котором показаны значения переменных для следующего кода.У меня проблема в том, что выражение возвращает false, когда я думаю, что оно, очевидно, должно быть true.

if (this.fileName.toLowerCase().contains(extension.toLowerCase())){
  return true;
}

Screen grab of debug showing variable values at runtime

У меня естьстолкнулся с этим сегодня, после поиска в Интернете я не вижу ничего очевидного, что здесь происходит.

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

if ("Android App Image.jpg".toLowerCase().contains("jpg".toLowerCase())){
  return true;
}

Я разбил его еще раз, поэтому результат получился логическим:

boolean result = ("Android App Image.jpg".contains("jpg"));

if (result) {
  return true;
}

Результат верен, поэтому .contains не является проблемой, скорее всего, мой if() не оценивает логическое значение как истинное и не вызывает выполнение return true.

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

public boolean isImage(){
    String[] imageExtensions = {"jpg", "png", "bmp", "gif"};

    for (String extension: imageExtensions) {

        if (this.localFileURLString != null && this.localFileURLString.toLowerCase().contains(extension)){
            return true;
        }

        boolean result = ("Android App Image.jpg".toLowerCase().contains("jpg".toLowerCase()));

        if (result) {
            return true;
        }else{
            Log.i("TEACH", "If evaluated false");
        }
    }

    return false;
}

ОБНОВЛЕНИЕ 1/2:

Я обрезал всю функцию с помощью жестко закодированных литералов и больше не использовал быстрое перечисление, который по-прежнему возвращает false, когда я ожидаю, что он вернет true:

public boolean isImage(){
    String[] imageExtensions = {"jpg", "png", "bmp", "gif"};

    for (int x = 0; x < imageExtensions.length; x++) {

        // String extension = imageExtensions[x];

        boolean result = ("Android App Image.jpg".toLowerCase().contains("jpg".toLowerCase()));

        if (result) {
            return true;
        }else{
            Log.i("TEACH", "If evaluated false");
        }
    }

    return false;
}

Функция не возвращает true или выполняется выполнение "If evaluated false" Log, она просто переходит прямо кпоследняя строка функции (return false;) после оценки строки if (result) { ... это как если бы if прерывал цикл.

ОБНОВЛЕНИЕ 2/2:

Проще говоря, даже самые простые операторы if внутри моей функции приведут к тому, что код перейдет к последней строке функции и вернет false.Например:

if(true == true){
  return true
}

Это произошло при переходе в режиме отладки, а также закодированные журналы показывают тот же результат, когда он не подключен к баггеру.

После возврата из функции каждый переходит какнормальный.Никаких ошибок и предупреждений.

переустановка Android Studio, попытка различных симуляторов и физических устройств Android не решила проблему.

Переименование функции не решило проблему.

Изменение типа возвращаемого значения функции с boolean на Boolean решило проблему.

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

Я оставлю вопрос открытым пока что, хотя изменение типа возврата «исправило» проблему дляя, я все еще не удовлетворен, я буду знать, почему ... вероятно, никогда не буду.

Надеюсь, кто-то гораздо более осведомленный в подобных вопросах может осветить это все!

Ответы [ 2 ]

0 голосов
/ 08 июля 2018

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

String[] imageExtensions = {".jpg", ".png", ".bmp", ".gif"};

Это позволит решить вашу проблему. Это может привести к ложному срабатыванию, если в имени файла есть нерегулярное использование DOT. Надеюсь, поможет.

0 голосов
/ 06 июля 2018

Почему бы вам не попробовать использовать:

if (this.fileName.toLowerCase().contains(extension.toLowerCase()==true){
}
...