12
votes

Pourquoi Null Référence est-elle imprimée comme "null"

in PrintLN, ici o.Tostring () jette la NPE mais O1, ne le fait pas. Pourquoi? XXX


1 commentaires

3 Réponses :


5
votes

C'est parce que impression (objet) utilise string.valueof (objet) pour la conversion (à part: après la conversion println (objet) < / a> se comporterait comme si impression (string) a été appelé, impression (objet) utilise efficacement écrire (int) ). string.valueof (objet) ne jette pas le NPE comme o.tostring () est et est défini à la place pour retourner "null" pour un paramètre null.


0 commentaires

5
votes
System.out.print(o1);

0 commentaires

27
votes

Cela pourrait vous aider à vous montrer le bytecode. Jetez un coup d'œil à la sortie suivante Javap de votre classe: xxx

Juste en regardant la méthode principale, vous pouvez voir les lignes d'intérêt sont où code est 8 et 33.

code 8 montre le bytecode pour que vous appeliez o.tostring () . Ici o est null et donc toute tentative d'une méthode d'invocation sur null résulte dans un nullpointerexception

code 18 indique votre objet NULL étant passé comme paramètre sur la méthode imprimanteam.print () méthode. En regardant le code source de cette méthode vous montrera pourquoi cela fonctionne pas résultat de la NPE: xxx

et string.valueof ( ) fera cela avec null s: xxx

afin que vous puissiez voir qu'il y a un test là-bas qui traite avec null et empêche une NPE.


2 commentaires

Je t'en prie. Je trouve souvent la recherche de la sortie Javap peut être assez perspicace. Surtout lorsque vous utilisez des choses comme Aspecj et d'autres technologies de tissage de code - juste pour voir exactement ce qu'ils ont fait à mon code!


Pas besoin de regarder le code. Tout est dans la documentation. PrintStream :: println dit qu'il appelle string.valueof , qui indique explicitement: "Si l'argument est null, une chaîne égale à" null "; sinon la valeur de obj.tostring () est retourné. "