Programme Null-safe en Java (Eclipse)

0. Introduction

Je me demandais s'il serait possible de vérifier la valeur null en Java à chaque fois, mais j'ai réalisé qu'Eclipse avait une fonction appelée Null Analysis. (Il semble qu'IntelliJ l'ait implémenté en premier)

J'ai recherché diverses choses, je vais donc résumer comment utiliser Null Analysys (à partir d'octobre 2018). À propos, la version d'Eclipse que j'utilise est 2018-09 (4.9.0). Fondamentalement, l'analyse nulle peut être effectuée après Juno (4.2), mais la dernière version est meilleure car il y a divers bogues.

1. Qu'est-ce que l'analyse nulle?

Un moyen de résoudre statiquement "Je ne veux pas vérifier null à chaque fois" en l'annotant comme Java. Pour plus d'informations, consultez Effectuer une analyse nulle avec Eclipse Juno.

Java 8 ou version ultérieure est nécessaire pour bénéficier correctement de Null Analysis. Sans les annotations de type JSR 308 implémentées dans Java 8, vous n'obtiendrez pas beaucoup d'avantages.

2. Quelle annotation doit être utilisée

Il existe diverses annotations similaires et différentes, telles que celles d'Eclipse et celles d'IntelliJ IDEA, qui sont difficiles à sélectionner.

Dans mon cas, je ne veux pas tellement mettre la couleur d'un IDE spécifique, donc en option, --JSR 305 @ javax.annotation.Nonnull``` série --Checker Framework série @ org.checkerframework.checker.nullness.qual.NonNull '' Sera non plus. Pour diverses annotations, Qu'est-ce que Nonnull? est détaillé.

De plus, compte tenu du système de modules de Java 9 ou version ultérieure, @ javax.annotation.Nonnull '' de JSR 305 ne peut pas être utilisé. En termes simples, si vous essayez d'utiliser le module externe javax.annotation.Nonnull``` where` `javax.annotation. *` `Est inclus en tant que module standard Java, l'espace de noms du package est en conflit. Pour le faire. Voir Faire fonctionner JSR 305 sur Java 9 pour plus de détails.

Par conséquent, l'annotation utilisée est une alternative à l'annotation Checker Framework.

Cependant, son utilisation sur Eclipse pose un problème. Dans Eclipse, le package cible pour Null Analysis est jugé par l'annotation @ NonNullByDefault```, mais Checker Framework traite toutes les valeurs par défaut comme NonNull en premier lieu, donc il n'a pas une telle annotation ( @ DefaultQualifier` ". `` Quelque chose est différent ... Des arguments sont nécessaires).

Faisons un peu de compromis ici et utilisons les annotations Eclipse pour @ NonNullByDefault```. Même si vous changez plus tard, vous ne devriez pas avoir beaucoup de problèmes.

3. Préparation pour l'analyse nulle

Lorsque vous utilisez des annotations, récupérez-les auprès de Maven Central. `` `build.gradle``` Un exemple est le suivant.

// https://mvnrepository.com/artifact/org.checkerframework/checker-qual
implementation group: 'org.checkerframework', name: 'checker-qual', version: '2.5.6'
// https://mvnrepository.com/artifact/org.eclipse.jdt/org.eclipse.jdt.annotation
implementation group: 'org.eclipse.jdt', name: 'org.eclipse.jdt.annotation', version: '2.2.100'

Null Analysis est désactivé par défaut dans Eclipse, vous devez donc également configurer le compilateur. La méthode est Qu'est-ce que Nonnull? Il est écrit en bas.

4. Comment écrire du code

4-1. Ajoutez `` @ NonNullByDefault '' à votre propre paquet

Fondamentalement, tous les packages créés par vous-même sont définis sur NonNull par défaut. Annotez simplement le `` package-info.java '' de votre propre paquet.

@org.eclipse.jdt.annotation.NonNullByDefault
package common.validator;

Ensuite, vous obtiendrez le code suivant

public class Foo {
    String a;
    public String bar(String b) {
        String bb = b + b;
        return bb;
    }
}

Comme indiqué ci-dessous, il semble avoir @ NonNull``` dans son ensemble.

public class Foo {
    @NonNull String a;  //Le champ est@NonNull

    @NonNull  //Valeur de retour@NonNull
    public String bar(@NonNull String b) { //Arguments formels@NonNull
        @NonNull String bb = bb + bb;  //Les variables locales aussi@NonNull
        return bb;
    }
}

4-2. @ NonNull et `` `` @ Nullable

@nonnullIl est garanti lors de la compilation (en temps réel lors de l'écriture de code dans eclipse) que null n'est pas entré à l'endroit marqué par. Au fait, ajoutez `` @ Nullable '' à l'endroit où vous voulez mettre null.

@nonnullSi vous essayez de mettre null dans une variable avec, vous obtiendrez une erreur de compilation et

@NonNull String a = null; //Erreur de compilation

Si vous essayez d'assigner une variable @ Nullable à une variable `` `` @ NonNull, même si elle n'est pas nulle, vous obtiendrez une erreur de compilation.

@Nullable String a = "a";
@NonNull String s = a; //Erreur de compilation

La même chose s'applique aux appels de méthode. Tenter de mettre une variable `` @ Nullable '' dans la méthode de l'exemple de classe ci-dessus entraînera une erreur de compilation.

Foo foo = new Foo();
@Nullable String nullableStr = "a";
String s = foo.bar(nullableStr); //Erreur de compilation ici

Bien entendu, il est possible d'assigner une variable qui est @ NonNull à une variable qui est` `` @ Nullable.

@NonNull String nonNullStr = "a";
@Nullable String nullableStr = nonNullStr; //OK

4-3. Pour changer la variable `@ Nullable``` en `@ NonNull```

Si vous utilisez le modèle DTO pour la communication avec l'extérieur, vous obtiendrez inévitablement une valeur de @ Nullable, vous devez donc le convertir en `` `` @ NonNull d'une manière ou d'une autre. Les bibliothèques externes n'ajoutent pas @ NonNull```, donc la valeur de retour sera traitée comme @ Nullable` ``.

La conversion se fait en affectant à une variable qui est @ NonNull, mais si vous l'affectez normalement, une erreur de compilation se produira, alors dites au compilateur que c'est` `` @ Nullable mais ce n'est pas nul. Il y a un besoin.

Comment dire 1: Communiquer avec des objets avec introduction à Java 7

objects#requirenonnull()Si vous le réussissez, le compilateur jugera qu'il a été vérifié. C'est facile à dire s'il est évident que null ne viendra pas. Si nul vientnullpointerexceptiondevenir.

@Nullable String nullableStr = 〜〜;
Objects.requireNonNull(nullableStr); //NullPointerException lorsque Null
@NonNull String nonNullStr = nullableStr; //OK

Si vous utilisez Null Analysis, vous utiliserez ce code fréquemment, il est donc pratique de le mettre dans le modèle de l'éditeur Java. Dans mon cas, je mets la définition suivante. Écrivez reqn` '' et appuyez sur `` Ctrl + Espace '' pour obtenir le code correctement.

Name                 : ReqNotNull
Context              : Java Statement
Automatically insert : true
Pattern:
${:import (java.util.Objects)}Objects.requireNonNull(${localVar})

Comment transmettre 2: Communiquer avec l'énoncé if

De cette façon, si vous ne voulez pas obtenir une exception `` NullPointerException '' lorsqu'elle est nulle.

@Nullable String nullableStr = 〜〜;
if (nullableStr != null) { //Dites avec une instruction if
    @NonNull String nonNullStr = nullableStr; //OK
}

Autre

S'il existe une autre façon de le dire, faites-le moi savoir

4-4. À propos des types de conteneurs tels que tableau / liste

Pour les tableaux

Un peu de considération est nécessaire pour les tableaux. Si vous déclarez un champ normalement (sous le package @ NonNullByDefault ''), la variable tableau elle-même devient @ NonNull, mais les objets qui entrent dans le tableau sont `` @ Nullable. devenir.

public class Foo {
    String[] args;  //args est NonNull, mais args[0]Est nul
}

Si vous voulez que le contenu soit `` @ NonNull '', ajoutez une annotation.

public class Foo {
    @NonNull String[] args;  //args args également[0]Aussi NonNull
}

La même chose est vraie lors de la définition d'arguments de longueur variable.

public class Foo {
    //Aucune annotation
    public void bar(String...args) { 
        //args est NonNull, mais args[0]Est nul
    }

    //Avec annotation
    public void baz(@NonNull String...args) {
        //args args également[0]Aussi NonNull
    }
}

Pour la liste

Dans le cas de List, contrairement à un tableau, le conteneur et le contenu sont `` @ NonNull ''.

public class Foo {
    List<String> args;  //args args également.get(0)Aussi NonNull
}

5. Points peu clairs

Une note de ce que je ne comprends pas

6. Conclusion

Je l'ajouterai quand j'aurai plus de connaissances.

Recommended Posts

Programme Null-safe en Java (Eclipse)
Premier développement Java dans Eclipse
Obtenir des valeurs de carte nulles en Java
Essayez d'exécuter Selenuim 3.141.59 avec eclipse (java)
Bonjour le monde de Java dans Eclipse maintenant
Créer un programme Servlet dans Eclipse
JPA (API de persistance Java) dans Eclipse
Changements dans Java 11
Janken à Java
MVC dans Eclipse.
[Java] Définir AdoptOpen JDK dans STS (Eclipse)
Construction de l'environnement Play Framework 2.6 (Java) avec Eclipse
Programmer les en-têtes et pieds de page PDF en Java
Taux circonférentiel à Java
FizzBuzz en Java
J'ai créé un programme de jugement des nombres premiers en Java
[Java] Création d'API à l'aide de Jerjey (Jax-rs) avec eclipse
J'ai écrit un programme de jugement des nombres premiers en Java
J'ai écrit un programme de factorisation prime en Java
Lire JSON en Java
Faites un blackjack avec Java
Programmation par contraintes en Java
Mettez java8 dans centos7
Procédure d'installation Java (eclipse)
Eclipse ~ Création de projet Java ~
NVL-ish guy en Java
Joindre des tableaux en Java
"Hello World" en Java
Interface appelable en Java
Commentaires dans la source Java
Fonctions Azure en Java
Formater XML en Java
Simple htmlspecialchars en Java
Pour déboguer avec Eclipse
Hello World en Java
Utiliser OpenCV avec Java
Mémorandum WebApi avec Java
Détermination de type en Java
Exécuter des commandes en Java (ping)
Divers threads en java
Implémentation du tri de tas (en java)
API Zabbix en Java
Art ASCII à Java
Comparer des listes en Java
POST JSON en Java
Exprimer l'échec en Java
Créer JSON en Java
Manipulation de la date dans Java 8
Nouveautés de Java 8
Utiliser PreparedStatement en Java
Nouveautés de Java 9,10,11
Exécution parallèle en Java
[Java] Création d'un programme de calcul 1
[LeJOS] Programmons mindstorm-EV3 avec Java [Construction de l'environnement partie 2]
Comment Git gérer les projets Java EE dans Eclipse
Appeler un programme écrit en Swift depuis Processing (Java)
Essayez d'utiliser RocksDB avec Java
Évitez l'erreur que Yuma a donnée en Java
Obtenir des informations EXIF en Java