У меня проблема, когда .contains()
не возвращает true
при поиске подстроки.
См. Фрагмент кода ниже и изображение, на котором показаны значения переменных для следующего кода.У меня проблема в том, что выражение возвращает false
, когда я думаю, что оно, очевидно, должно быть true
.
if (this.fileName.toLowerCase().contains(extension.toLowerCase())){
return true;
}
У меня естьстолкнулся с этим сегодня, после поиска в Интернете я не вижу ничего очевидного, что здесь происходит.
Я пробовал то же самое с использованием литералов, но все равно не оценивается как истина:
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
решило проблему.
Мне хорошо известны различия в этих типах, но я все еще озадачен тем, почему это может быть причиной этой проблемы.Я могу только предположить, что изменение сигнатуры метода таким образом решило, что во время компиляции происходило что-то напуганное.
Я оставлю вопрос открытым пока что, хотя изменение типа возврата «исправило» проблему дляя, я все еще не удовлетворен, я буду знать, почему ... вероятно, никогда не буду.
Надеюсь, кто-то гораздо более осведомленный в подобных вопросах может осветить это все!