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.