6
votes

Unboxing Un objet Boxed nul se jette inattendue NullPointerException

Si vous exécutez le code suivant,

Exception in thread "main" java.lang.NullPointerException
    at Foo.main(Foo.java:3)


1 commentaires

Je ne comprends pas. Demandez-vous pourquoi la NPE arrive ou c'est juste une déclaration? Quelle serait la question de réponse spécifique?


6 Réponses :


6
votes

Je ne sais pas ce que l'IDE utilisez-vous, mais Eclipse a une option pour permettre l'avertissement sur les conversions de boxe et de transbording. Il n'est pas possible de le détecter en tant qu'accès de pointeur NULL, puisque NULL n'est pas immédiatement inscrit, mais via bar.getid () . .

L'expression de type entier est non constituée dans Int
Foo.java ligne 3


2 commentaires

J'utilise Eclipse depuis environ 3 ans et je ne le savais pas! Doux!


Il est ennuyant que Eclipse ne puisse pas activer les avertissements de non-boîte sans la boxe! bugs.eclipse.org/bugs/show_bug.cgi?id=163065



6
votes

Si vous essayez d'utiliser n'importe quelle méthode sur un NULL ou faites tout ce qui n'a aucun sens avec un null , il jette un nullpointeexception .

Autounboxing est implémenté avec le [objet integer] .IntValue () méthode (ou similaire), de sorte qu'il jette un nullpointerexception car vous ne pouvez pas avoir null invoquer une méthode.

J'espère que cela vous aide!


0 commentaires

0
votes

nullpointeException est un RunTimeException que l'IDE ne peut pas détecter lors de la compilation du code.

Au lieu de cela, une bonne pratique est de vérifier NULL avant de non-goûter. < Pré> xxx


0 commentaires

0
votes

semble être une exception de temps d'exécution parfaitement raisonnable. Si votre code principal était:

private static class Bar{
    private final int id;

    public Bar(){
        this(0);
    }

    public Bar(int id){
        this.id = id;
    }

    public int getId(){
        return id;
    }
}


6 commentaires

Je n'ai pas dit que l'exception était déraisonnable, j'ai dit que c'était inattendu, d'autant plus que mon IDE a choisi de l'ignorer par défaut.


Ok, j'essayais de me contenter de ce qui est "attendu" et "inattendu". C'est une exception de temps d'exécution, pas quelque chose qui peut être nécessairement déterminé à partir d'une analyse statique. Comment vous attendez-vous à ce que l'IDE se comporte dans cette situation?


Je m'attendais à ce que l'IDE me prénome au moins par défaut. Comme je l'ai dit, je pense que c'est une exception d'exécution assez subtile.


Vous vous attendriez à déterminer toutes les situations où vous pourriez avoir une période d'exécution NPE? Cela me frappe comme couru contre le théorème de Gödel. Mais je recommande d'éviter la classe entière lorsque vous n'en avez pas besoin.


Non, vous êtes hyperbolique. Je ne m'attendrais pas à ce qu'il représente pour tous les scénarios. Mais il semble que les autres pensaient la même chose depuis que Eclipse fournit une telle fonctionnalité en matière de boxe / de construction.


Désolé pour aller hyperbolique, vous avez raison. Donc, l'avertissement que vous voulez est simplement que cela fait un type en ligne d'un entier à un int? Je suppose que Eclipse peut le faire pour vous comme un avertissement.



5
votes

Il semble que ce comportement soit documenté dans le JDK ™ 5.0 Documentation ,

.. Vous pouvez ignorer largement la distinction entre int et entier , avec quelques mises en garde. Un Integer expression peut avoir une valeur null. Si votre Programme essaie de Autounbox NULL, il lancera un nullpointException .


0 commentaires

0
votes

La boxe n'est rien de plus que le sucre syntaxiste pour casser un objet comme entier à la équivalent natif 'int'. Les autochtones ne peuvent pas être nuls mais les objets peuvent. Le mécanisme de boxe n'empêchera pas NullpointerExceptions dans ces cas.


0 commentaires