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?

Adibe7
quelle
1
Mögliches Duplikat von Kann ich assert auf Android-Geräten verwenden?
Flow
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 ...

PearsonArtPhoto
quelle
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.

Zeiger Null
quelle
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.

Paweł Nadolski
quelle
Das wollte ich gleich beantworten :)
Geekarist
5

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

Ersetzen Sie RuntimeException () durch einen geeigneten Ausnahmesubtyp.

mah
quelle
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!

Pragman
quelle
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
Shuyan Ji
quelle