Wie verwende ich assert in android?


77

Ich möchte assert obj != null : "object cannot be null"auf Android-Gerät verwenden. Die Behauptung scheint nicht zu funktionieren, also habe ich online gesucht und diese lokale Lösung gefunden:

adb shell setprop debug.assert 1

Es funktioniert auf meinem lokalen Computer.

Ich möchte diesen Befehl mit meinem Eclipse-Projekt ausführen (also in der Quellcodeverwaltung). Wie kann ich es tun?



Definieren Sie "funktioniert nicht". Meinst du, es hat keine offensichtliche Wirkung? Oder hat es eine andere Wirkung als erwartet?
— LarsH

Antworten:


88

Assert funktioniert in Android nicht, da eine Person die meiste Zeit nicht im Debug-Modus ausgeführt wird, sondern in optimiertem Code. Daher besteht die richtige Lösung darin, eine Ausnahme mit folgendem Code manuell auszulösen:

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

Es ist zu beachten, dass Asserts standardmäßig für den Debug-Code und nicht für den Release-Zeitcode vorgesehen sind. Dies ist möglicherweise nicht die beste Verwendung, um einen Assert zu werfen. Aber so kannst du es trotzdem machen, also ...



3
Jemand bitte sagen Sie mir, dass dieser Code lesen sollte, wenn (obj == null)
— Lo-Tan

1
Warnung zum Kopieren von Pastern: Dies sollte "werfen", nicht "geworfen"
— lauten

2
Ich würde diesen Wurf AssertionError anstelle von Exception machen.
— Ellen Spertus

4
Ihre Antwort ist falsch, dafür sind Behauptungen nicht gedacht. Asserts werden automatisch aus dem Release-Code entfernt, wenn Ihr Zustand nicht vorliegt. Sie können eine ähnliche if-Bedingung in Kombination mit dem BuildConfig.DEBUG-Flag verwenden, z. B.: If (BuildConfig.DEBUG && obj == null) throw ... BuildConfig.DEBUG ist eine Kompilierungszeitkonstante, sodass der Compiler solche Bedingungen in der entfernen kann Release-Code vollständig. BuildConfig.DEBUG ist jedoch nie für lib-Projekte festgelegt, was das Ganze wiederum ein wenig nutzlos macht.
— b005t3r

13

Auf einem Android 4.x-Gerät getestet, ist es möglich, Java Assert auf einem Android-Gerät zu verwenden:

  • Bearbeiten Sie /system/build.prop (zum Beispiel von X-plore ) und fügen Sie am Ende der Datei eine Zeile hinzu: debug.assert = 1
  • Telefon neustarten

Jetzt ist es für Ihr Android-Gerät sinnvoll, Überprüfungen zu aktivieren, und es wird AssertionError ausgelöst, wenn die Bestätigungsprüfung fehlschlägt.

BEARBEITEN:

Ein weiterer einfacher Ansatz, der Asserts vom PC bis zum Neustart des Geräts ermöglicht:

platform-tools\adb shell setprop debug.assert 1

Sie können beispielsweise eine .bat-Datei (unter Windows) erstellen und ausführen, wenn das Gerät angeschlossen ist.


1
Ich setze "platform-tools \ adb shell setprop debug.assert 1", aber idk warum, es wird keine Ausnahme ausgelöst, wenn die Assert-Zeile erreicht wird. Müssen wir den Debug-Modus verwenden?
— HendraWD

1
Versucht mit Debug-Modus, aber immer noch das gleiche. Meine Android-Version ist 5.1.1 und es ist gerootet, idk, wenn das das Problem sein kann
— HendraWD

@HendraWD: Funktioniert auch nicht in Nexus 5 ohne Rootberechtigung.
— Daniel

10

Erstellen Sie Ihre eigene Assert-Methode:

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

Wenn Sie dasselbe Objekt zurückgeben, können Sie dies der Kürze halber in Zuweisungen verwenden.


Das wollte ich gleich beantworten :)
— Geekarist

5

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

Ersetzen Sie RuntimeException () durch einen geeigneten Ausnahmesubtyp.


5

Das Teilen meiner Klasse, die ich für Behauptungen auf Android verwende, ist einfacher, hat eine schöne Benennung und ist sehr elegant, weil Sie damit Aussagen wie diese schreiben können:

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

Hier ist der Code für die Klasse:

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

Ich hoffe es hilft!


1

Um Assertion in Java Virtual Machine verfügbar zu machen, verwenden Sie - enableassertions oder - ea Befehlszeilenoptionen

  • an der Eingabeaufforderung von Window,

    java –ea YourApp

  • auf Android Studio 3.0, auf Extras / Bearbeiten von Konfigurationen / VM - Optionen , Eingang - enableassertions oder - ea
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.