81 votes

Comment utiliser assert dans Android ?

Je veux utiliser assert obj != null : "object cannot be null" sur un appareil Android. L'affirmation ne semble pas fonctionner, alors j'ai cherché en ligne et j'ai trouvé cette solution locale :

adb shell setprop debug.assert 1

il fonctionne sur ma machine locale.

Je veux exécuter cette commande en utilisant mon projet Eclipse (pour qu'il soit dans le contrôle de la source). Comment puis-je le faire ?

1 votes

0 votes

Définissez "ne fonctionne pas". Voulez-vous dire qu'il n'a aucun effet apparent ? Ou qu'il a un effet mais différent de celui que vous attendiez ?

93voto

PearsonArtPhoto Points 14639

Assert ne fonctionnera pas dans Android car, la plupart du temps, une personne ne fonctionne pas en mode de débogage, mais plutôt dans un code optimisé. Ainsi, la bonne solution est de lancer manuellement une exception, avec un code comme celui-ci :

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

Il convient de noter que, par conception, les alertes sont destinées au code de débogage, et non au code de sortie. Ce n'est donc peut-être pas la meilleure façon d'utiliser un Assert. Mais c'est quand même ainsi que vous pouvez le faire, alors...

6 votes

3 votes

Quelqu'un peut me dire que ce code devrait se lire if (obj == null)

1 votes

Avertissement aux copieurs : il faut lire "throw" et non "thrown".

13voto

Pointer Null Points 14229

Testé sur un appareil Android 4.x, il est possible d'utiliser Java assert sur un appareil Android :

  • Modifier le fichier /system/build.prop (par exemple par X-plore ), ajouter une ligne à la fin du fichier : debug.assert=1
  • Redémarrer le téléphone

Maintenant votre appareil Android est sensible aux vérifications d'assertion, et lancera AssertionError quand la vérification d'assertion échoue.

EDIT :

Une autre approche simple consiste à activer les assertions du PC jusqu'à ce que le dispositif soit redémarré :

platform-tools\adb shell setprop debug.assert 1

Vous pouvez par exemple créer un fichier .bat (sous Windows) et l'exécuter lorsque le dispositif est connecté.

1 votes

J'ai défini "platform-tools \adb shell setprop debug.assert 1" mais je ne sais pas pourquoi, il ne lève aucune exception lorsqu'il atteint la ligne assert. Doit-on utiliser le mode débogage ?

1 votes

J'ai essayé avec le mode débogage, mais c'est toujours pareil. Ma version d'Android est 5.1.1 et il est enraciné, je ne sais pas si cela peut être le problème.

0 votes

@HendraWD : Cela ne fonctionne pas non plus sur le Nexus 5 non rooté.

10voto

Paweł Nadolski Points 2320

Créez votre propre méthode d'assertion :

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

Renvoyer le même objet permet de l'utiliser dans les affectations pour des raisons de brièveté.

5voto

Maha Points 41

Je partage ma classe que j'utilise pour les assertions sur Android, elle est plus simple, a un bon nommage et est très élégante car elle vous permet d'écrire des assertions comme ceci :

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

Voici le code de la classe :

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

J'espère que cela vous aidera !

5voto

mah Points 21457

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

Remplacez RuntimeException() par un sous-type d'exception approprié.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X