in PrintLN, ici o.Tostring () jette la NPE mais O1, ne le fait pas. Pourquoi?
3 Réponses :
C'est parce que impression (objet) code>
utilise string.valueof (objet) code>
pour la conversion (à part: après la conversion println (objet) code> < / a> se comporterait comme si
impression (string) code>
a été appelé, impression (objet) code> utilise efficacement
écrire (int) code>).
string.valueof (objet) code> ne jette pas le NPE comme
o.tostring () code> est et est défini à la place pour retourner
"null" code> pour un paramètre null. p>
System.out.print(o1);
Cela pourrait vous aider à vous montrer le bytecode. Jetez un coup d'œil à la sortie suivante Juste en regardant la méthode principale, vous pouvez voir les lignes d'intérêt sont où code 8 montre le bytecode pour que vous appeliez code 18 indique votre objet code> NULL code> étant passé comme paramètre sur la méthode et afin que vous puissiez voir qu'il y a un test là-bas qui traite avec Javap code> de votre classe:
code code> est 8 et 33. p>
o.tostring () code>. Ici
o code> est
null code> et donc toute tentative d'une méthode d'invocation sur
null code> résulte dans un
nullpointerexception p >
imprimanteam.print () code> méthode. En regardant le code source de cette méthode vous montrera pourquoi cela fonctionne pas em> résultat de la NPE: p>
string.valueof ( ) code> fera cela avec
null code> s: p>
null code> et empêche une NPE. p> p>
Je t'en prie. Je trouve souvent la recherche de la sortie Javap code> 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 code> dit qu'il appelle
string.valueof code>, qui indique explicitement: "Si l'argument est null, une chaîne égale à" null "; sinon la valeur de obj.tostring () est retourné. "
C'est Tous Dans la documentation .