не вдається викликати String.isEmpty () в android


80

У моєму додатку для Android я не можу використовувати функцію String.isEmpty (), яка знаходиться в JDK 1.6. В Android 2.1 lib немає цієї функції в класі java.lang.String

Я намагався ввести системну бібліотеку JRE до свого проекту, оскільки вона має цю функцію, але ніяких ефектів не було.

Як я можу вирішити цю проблему і дозволити моїй програмі використовувати цю функцію?


11
isEmpty додано в API рівня 9. Дивіться тут developer.android.com/reference/java/lang/…
Mudassir

3
Дивно, я не стикався з цією проблемою. Однак я уникаю використання .isEmpty (). Я просто віддаю перевагу використанню if (myString == null || myString.trim (). Size () == 0)
Алі

1
@Ali - тьфу !! Схоже на те, що код, над яким ви працюєте, погано спрацьовує і перевіряє свої API / передумови інтерфейсу та післяумови.
Стівен С

До кінця, ви навіть можете сказати JavaC скомпілювати код, щоб бути сумісним із сукупною версією JRE. Я ніколи не пробував, але мені цікаво, чи було б це простішим рішенням у цьому випадку. @Stephen: Наш архітектор програмного забезпечення сказав мені завжди перевіряти наявність нулів при отриманні значення із виклику API. Крім того, при введенні користувачем ми часто маємо невідповідність, коли інтерфейс може повернути null, якщо поле порожнє, або порожній рядок, якщо користувач фокусує поле, але нічого не вводить. Дивно, я знаю.
Алі

2
@Ali - Я не вражений вашим архітектором. IMO, кращою ідеєю є виявлення та обробка нулів у джерелі, а не в кожному API. Окрім цього, розглядайте несподівані нулі як помилки і нехай вони перетворюються на NPE. Проблема явного тестування на нульові значення полягає в тому, що ваш код захаращений безглуздими перевірками, і ви можете потрапити в пастку "виправлення" нульових значень, перетворивши їх у порожні рядки (наприклад).
Stephen C

Відповіді:


83

Як я можу вирішити цю проблему і дозволити моїй програмі використовувати цю функцію?

Ви не можете.

Використовуйте String.length() == 0замість цього. Він сумісний із зворотним зв'язком аж до JDK 1.0 ... і з J2ME також.

String.equals("") є ще однією альтернативою.


Ви впевнені, що неможливо налаштувати Eclipse для розміщення в класах коду з певних бібліотек?

Ні, якщо ви хочете, щоб ваш додаток працював на справжньому пристрої Android. Платформи Java / Android навмисно ускладнюють вам базікання з поведінкою бібліотек основних класів. Для початку ви можете зробити це, лише змінивши еквівалент Davlik завантажувального шляху або rt.jarфайлу, і жодного з них не можна зробити в запущеному JVM.

Таке майстерність має ризик потенційно зламати Java для інших програм. Навіть припускаючи, що ви не можете компрометувати поділ додатків Android безпосередньо (через зазначене нижче розділення процесів / iid), зловмисні налаштування (спільних) основних класів Java все одно можуть потенційно дозволити одній програмі втручатися або красти інформацію з іншої програми .


Проблема в тому, що я працюю з JSONRPC, використовуючи класи з безкоштовної бібліотеки code.google.com/p/json-simple, і існує функція JSONRPC2Message.parse (String arg0), яка використовує метод String.isEmpty (), тому, коли Я запускаю свою програму, я отримую виняток java.lang.noSuchMethodError. Ви впевнені, що неможливо налаштувати Eclipse для розміщення в класах коду з певних бібліотек? Я маю на увазі, якщо я хочу використовувати клас String не з бібліотеки Android 2.1, а з бібліотеки JRE System?
teoREtik

7
Json-simple - це відкритий код; створити власну версію бібліотеки, яка не використовує String.isEmpty (). Це набагато простіше (і безпечніше), ніж спроба адаптувати бібліотеку виконання Android.
торедж

Якби вони цього не зробили, для зловмисного додатка було б тривіально підірвати безпеку - я справді сумніваюся в цьому. Кожна програма працює в окремому процесі Linux під своїм власним uid, і безпека Android не покладається на захист пакетів Java. Якщо програма змінює власну копію String, це не впливає на інші програми.
Poolie

@poolie - Добре, але хіба в "JVM", що запускає додаток, немає пісочниці? (Мені трохи важко повірити, що це безпека на рівні Linux - це єдиний захист, який ви маєте від неправдивих програм, що працюють на вашому телефоні Android.)
Стівен С


120

Замість цього ви можете використовувати android.text.TextUtils.isEmpty () . Цей метод також перевіряє, чи є рядок нульовим і доступний з рівня API 1.

if (TextUtils.isEmpty(str)) {
    Log.d(TAG, "String is empty or null!");
}

6

цей метод з’явився в API9, тому ви не можете використовувати його до Android2.3


5

Ви можете використовувати це TextUtils.isEmpty(str). Це доступно з API рівня 1 або Ви можете створити власний метод, як показано нижче

public boolean isEmpty(CharSequence str) {
    if (str == null || str.length() == 0)
        return true;
    else
        return false;
}

2
Я думаю, це має бути обрана відповідь. Usint TextUtils - найкращий варіант. Вам не потрібно створювати власну функцію, щоб зробити те саме.
Генавт

Ви знаєте, що могли просто написати return (str == null || str.length() == 0);, так?
Піовезан

@Piovezan так, ми можемо написати і це
Shan Xeeshi

4

наскільки я знаю, Android підтримує java 5, тому немає жодного, isEmpty();що можна використовувати length()для імітаціїisEmpty()


1

"" .equals (yourString); також дає таку ж поведінку, як String.isEmpty ();


Це насправді найкраще рішення, оскільки воно також запобігає NullPointerException
Лукас

Це не найкраще рішення, оскільки ви створюєте новий об'єкт String кожного разу, коли ви хочете порівняти, тоді як ви за допомогою isEmpty перевіряєте нуль та довжину.
Генаут

2
@ user1422434 - Ні, ти не є. Існує один і лише один об’єкт, що представляє порожній літеральний рядок для всієї ВМ.
Стівен С

Але я також не згоден з @Lukas. Рішення, які "запобігають неперервному впливу", загалом кажуть поганою ідеєю. Краща ідея - з’ясувати, звідки береться несподіване null, та вирішити цю проблему . "".equals(yourString)Підхід є лише хорошим рішенням , якщо nullзначення yourStringмає сенс ... і очікувалося.
Стівен С

-4

Вам потрібно оновити android API до рівня 9, або використовувати, String.trim().length()==0або String.equals("")замість цього, це має працювати для вашого рівня API android та вашої версії JDK.


Що? Рядок " "не пустий! Чому ви пропонуєте обрізати рядок?
ruX

1
@ruX " ".trim()буде порожнім !!! Ви це взагалі знаєте ?? Не оцінюйте, якщо ви НЕ розумієте мого опису !!!
Engine Bai

@Eugenie Bai String.trim().length()==0 і String.equals("")повертайте різні результати, коли String = " ". Другий фрагмент правильний
ruX
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.