Як використовувати assert в android?


77

Я хочу використовувати assert obj != null : "object cannot be null"на пристрої Android. Схоже, твердження не працює, тому я здійснив пошук в Інтернеті і знайшов таке локальне рішення:

adb shell setprop debug.assert 1

це працює на моїй локальній машині.

Я хочу запустити цю команду, використовуючи мій проект Eclipse (щоб це було в елементі керування джерелом). Як я можу це зробити?



Визначте "не працює". Ви маєте на увазі, що це не має явного ефекту? Або це має ефект, але відрізняється від того, що ви очікували?
LarsH

Відповіді:


88

Assert не працюватиме в Android, оскільки більшість випадків людина працює не в режимі налагодження, а, скоріше, про оптимізований код. Отже, правильним рішенням є вручну викинути виняток із таким кодом:

if (obj==null) throw new AssertionError("Object cannot be null");

Слід зазначити, що за задумом Asserts призначені для коду налагодження, а не для коду часу випуску. Тож це може бути не найкращим використанням кидання Асерта. Але це як ти можеш це зробити досі, тому ...



3
Хтось, будь ласка, скажіть мені, що цей код повинен читати if (obj == null)
Lo-Tan

1
попередження копіювати пастерів: тут слід читати "кидати", а не "кидати"
chrisben

2
Я б зробив цей викид AssertionError замість Exception.
Еллен Спертус

4
Ваша відповідь неправильна, це не те, що стосується тверджень. Твердження автоматично видаляються з коду випуску, де вашого стану не буде. Ви можете використовувати подібний умова if у поєднанні з прапором BuildConfig.DEBUG, наприклад так: if (BuildConfig.DEBUG && obj == null) throw ... BuildConfig.DEBUG - це константа часу компіляції, тому компілятор може видалити такі умови в код випуску повністю. Однак BuildConfig.DEBUG ніколи не встановлюється для lib-проектів, тому знову ж таки це робить все трохи марним.
b005t3r

13

Перевірено на пристрої Android 4.x, можна використовувати Java assert на пристрої Android:

  • Відредагуйте /system/build.prop (наприклад, за допомогою X-plore ), додайте рядок у кінці файлу: debug.assert = 1
  • Перезавантажте телефон

Тепер ваш пристрій Android має сенс стверджувати перевірки і видасть AssertionError, коли перевірка затвердження не вдається.

РЕДАГУВАТИ:

Ще один простий підхід - увімкнення тверджень з ПК до перезапуску пристрою:

platform-tools\adb shell setprop debug.assert 1

Наприклад, ви можете створити файл .bat (у Windows) і запустити його, коли приєднано пристрій.


1
Я встановив "platform-tools \ adb shell setprop debug.assert 1", але idk чому, це не викликає жодних винятків, коли досягаєте рядка затвердження. Чи потрібно нам використовувати режим налагодження?
HendraWD

1
Пробував із режимом налагодження, але все той же. Моя версія для Android - 5.1.1, і вона коренева, idk, якщо це може бути проблемою
HendraWD

@HendraWD: Також не працює в некорневому Nexus 5.
Даніель

10

Створіть власний метод затвердження:

public static <T> T assertNotNull(T object) {
    if (object == null)
        throw new AssertionError("Object cannot be null");
    return object;
}

Повернення того самого об'єкта дозволяє використовувати це в завданнях для стислості.


Ось на що я збирався відповісти :)
Geekarist

5

if (somevar == null) throw new RuntimeException();

Замініть RuntimeException () відповідним підтипом виключення.


5

Спільний доступ до свого класу, який я використовую для тверджень на Android, його простіший, має приємні імена та дуже елегантний, оскільки дозволяє писати такі твердження:

Assert.that(obj!=null, "Object should not be null");

Ось код для класу:

public class Assert {
    public static void that(boolean condition, String message) {
        if (!condition) {
            throw new AssertionError(message);
        }
    }
}

Сподіваюся, це допоможе!


1

Щоб зробити твердження доступним у віртуальній машині Java, використовуючи - enableassertions або - ea параметри командного рядка

  • у командному рядку вікна,

    java –ea YourApp

  • в Android Studio 3.0, на Інструменти / Редагування конфігурацій / Параметри віртуальної машини , введення - enableassertions або - ea
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.