Journal Enfin des NullPointerException plus explicites en Java

Posté par  . Licence CC By‑SA.
Étiquettes :
16
30
sept.
2019

Comme il était énoncé dans la fin de la dépêche sur OpenJDK 13. La prochaine version du langage le plus utilisé du monde®, les NullPointerExceptions seront plus détaillées afin d’aider le développeur à trouver où ses doigts ont fourché.
Les détails sont à lire dans la JEP 358 dont j’ai extrait deux exemples :

For example, an NPE from the assignment statement a.i = 99; would generate this message:

Exception in thread "main" java.lang.NullPointerException:
Cannot assign field 'i' because 'a' is null.
at Prog.main(Prog.java:5)

If the more complex statement a.b.c.i = 99; throws an NPE, the message would dissect the statement and pinpoint the cause by showing the full access path which led up to the null:

Exception in thread "main" java.lang.NullPointerException:
Cannot read field 'c' because 'a.b' is null.
at Prog.main(Prog.java:5)

Le bémol c’est que Java 14 ne sera pas une LTS, la prochaine est la 17 il me semble. Ce n’est donc pas demain la veille que la plupart des développeurs profiteront de cette évolution.

  • # Pas demain la veille

    Posté par  (site web personnel) . Évalué à 3.

    Ce n’est donc pas demain la veille que la plupart des développeurs profiteront de cette évolution.

    Il suffit de compiler et tester avec les deux versions.

  • # Pendant ce temps, à Saint-Pétersburg...

    Posté par  . Évalué à 2.

    Kotlin évite le problème entièrement en implémentant Null Safety tout en étant entièrement compatible avec Java.

    • [^] # Re: Pendant ce temps, à Saint-Pétersburg...

      Posté par  . Évalué à 2.

      D’ailleurs c’est bien dommage que Java ne s’inspire pas de Kotlin sur cette partie.

    • [^] # Re: Pendant ce temps, à Saint-Pétersburg...

      Posté par  . Évalué à 4.

      Je ne dirais pas qu'il évite entièrement le problème. Il donne quelques clefs très utile mais pour supprimer le problème il faut aller plus loin que ça. D'ailleurs le liens que tu donne explique dès le début qu'ils n'ont pas supprimé le problème.

      La seule façon de supprimer le problème (que je connaisse), c'est de supprimer les valeurs null du langage. Si tu veux représenter du vide tu dois utiliser un type MonType|Nothing et vérifier le type à chaque usage dangereux.

      https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

      • [^] # Re: Pendant ce temps, à Saint-Pétersburg...

        Posté par  (site web personnel, Mastodon) . Évalué à 5.

        C'est à peu près ce que propose Kotlin : en supposant que Nothing soit représenté par null, si tu veux représenter du vide tu dois utiliser MonType|null (ce qui s'écrit MonType? en Kotlin) et faire la vérification à chaque usage dangereux.

        Littératures de l’imaginaire, libres, pour tout le monde : https://renardspatial.com/ | La connaissance libre : https://zestedesavoir.com

        • [^] # Re: Pendant ce temps, à Saint-Pétersburg...

          Posté par  . Évalué à 1.

        • [^] # Re: Pendant ce temps, à Saint-Pétersburg...

          Posté par  . Évalué à 2.

          Oui et non. Pour avoir utiliser kotlin et elm l'usage est vraiment différent. Rien que l'existence de l'opérateur !! montre que le problème n'est pas totalement résolue. NPE est une exception runtime, quand tu utilise tu délègue à quelqu'un d'autres gestion de l'absence de valeur sans lui dire.

          C'est déroutant de voir ces langages sans valeur null qui ont complètement supprimé ce forme d'erreur (elle n'est pas représentable dans le langage), mais des fois c'est super agréable.

          https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

          • [^] # Re: Pendant ce temps, à Saint-Pétersburg...

            Posté par  (site web personnel, Mastodon) . Évalué à 6. Dernière modification le 30 septembre 2019 à 17:08.

            Ben ils tournent sur la JVM avec possibilité d'appeler du Java de façon transparente, donc ils sont obligés de gérer le problème.

            Mais tant que tu restes dans du pur Kotlin propre, ça fonctionne.

            Littératures de l’imaginaire, libres, pour tout le monde : https://renardspatial.com/ | La connaissance libre : https://zestedesavoir.com

            • [^] # Re: Pendant ce temps, à Saint-Pétersburg...

              Posté par  . Évalué à 2.

              Ah mais je n'ai jamais dis qu'il n'y avait pas de bonne explication. C'est juste le « ils ont complètement supprimé le problème » qui m'a fait réagir.

              https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll

  • # Source pour Java 17 en LTS ?

    Posté par  . Évalué à 4.

    J'ai fouiné sur les internets, et la seule référence à Java 17 étant une LTS est sur Wikipedia, et l'info n'est pas sourcée sur Wikipedia. Sur ce que j'ai trouvé sur le site officiel, la Roadmap de support s'arrête à la 13 et je n'ai pas trouvé de vraie roadmap exhaustive.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.