redhat-developer / redhat-developer/vscode-java

@Nonnull fields are assumed to be non-null in the constructor

Ouverte
#2,713 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug code analysis upstream
Langage dominant
TypeScript
Étoiles
2.3k
Forks
546
Merge moyen
20 h 1 min
PR mergées (30 j)
11

Description

Class fields annotated with @Nonnull are currently assumed to never be null in the class constructor.
@Nonnull only provides guarantees after construction has finished, and checking these fields in the constructor is often useful to avoid boilerplate variables.

A toy example illustrating the issue:

public class AnnotatedClass {
    private @Nonnull String specialValue;
    private @Nonnull Map<String, String> allValues = new HashMap<>();

    /* this constructor incorrectly warns that specialValue might not have been initialized */
    public AnnotatedClass(Iterable<String> values) {
        for (String entry : values)
        {
            String[] split = entry.split("=", 1);
            if (split.length != 2) throw new IllegalArgumentException("Value improperly formatted");

            final String key = split[0];
            final String value = split[1];
            if (value == null) /* needed to avoid warning on the assignment to specialValue later */
                continue;      /* side note: ideally we wouldn't need this, and the IDE           */
                               /*  would recognize that entry.split returns array of non-null     */
            this.allValues.put(key, value);
            if ("specialKey".equals(key))
                this.specialValue = value;
        }
        if (this.specialValue == null) /* the next line incorrectly produces a dead code warning */
            throw new IllegalArgumentException("The provided iterable does not have a special value!");
    }
}
Environment
  • Operating System: Windows 10 Enterprise
  • JDK version: openjdk 11.0.12 2021-07-20
  • Visual Studio Code version: 1.71.2
  • Java extension version: v1.11.0

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par reproduire l’avertissement avec l’exemple AnnotatedClass fourni dans VS Code, en utilisant l’extension Java et l’environnement JDK indiqué. Suivez le comportement de l’analyse de nullité pour les champs @Nonnull lors de la construction ; le travail est terminé lorsque la vérification de nullité et l’affectation ultérieure ne produisent plus d’avertissements incorrects, tandis que les problèmes réels continuent d’être signalés.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
java
Domaine
devtools
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.