String x = (String) null;
Pourquoi il n'y a aucune exception dans cette déclaration?
String x = null;
System.out.println(x);
Il imprime null
. Mais la .toString()
méthode doit lever une exception de pointeur nul.
String x = (String) null;
Pourquoi il n'y a aucune exception dans cette déclaration?
String x = null;
System.out.println(x);
Il imprime null
. Mais la .toString()
méthode doit lever une exception de pointeur nul.
Réponses:
Vous pouvez effectuer un cast
null
vers n'importe quel type de référence sans aucune exception.La
println
méthode ne lance pas de pointeur nul car elle vérifie d'abord si l'objet est nul ou non. S'il est nul, il imprime simplement la chaîne"null"
. Sinon, il appellera latoString
méthode de cet objet.Ajout de plus de détails: méthode d'appel interne des méthodes d'impression
String.valueOf(object)
sur l'objet d'entrée. Et dans lavalueOf
méthode, cette vérification permet d'éviter une exception de pointeur nul:Pour le reste de votre confusion, appeler n'importe quelle méthode sur un objet nul devrait lever une exception de pointeur nul, sinon un cas spécial.
la source
Vous pouvez effectuer un cast
null
vers n'importe quel type de référence. Vous pouvez également appeler des méthodes qui gèrent unnull
comme argument, par exempleSystem.out.println(Object)
, mais vous ne pouvez pas référencer unenull
valeur et appeler une méthode dessus.BTW Il existe une situation délicate où il semble que vous pouvez appeler des méthodes statiques sur des
null
valeurs.la source
t.yield() -> Thread.yeld()
quand même? Similaire à la façon dontfinal int i = 1; while (i == 1)
est optimisé pourwhile(true)
C'est par conception. Vous pouvez effectuer un cast
null
vers n'importe quel type de référence. Sinon, vous ne pourrez pas l'affecter à des variables de référence.la source
La conversion de valeurs null est requise pour la construction suivante où une méthode est surchargée et si null est transmis à ces méthodes surchargées, le compilateur ne sait pas comment lever l'ambiguïté, nous devons donc transtyper null dans ces cas:
Sinon, vous ne pourriez pas appeler la méthode dont vous avez besoin.
la source
String bar = null;
convertit lanull
valeur enString
. Jusqu'à présent, je n'avais qu'à transtyper explicitement null dans un test où une méthode était surchargée et je voulais tester son comportement avec une entrée null. Pourtant, bon à savoir, j'étais sur le point d'écrire une réponse similaire avant de trouver la vôtre.l instanceof Long
ets instanceof String
reviendrafalse
dans ces cas.Println(Object)
les usagesString.valueOf()
Print(String)
vérifie null.la source
De nombreuses réponses mentionnent déjà ici
et
Je me suis demandé où cela est spécifié et j'ai cherché la spécification Java:
La référence nulle peut toujours être affectée ou convertie en n'importe quel type de référence (§5.2, §5.3, §5.5).
Si la référence est nulle, elle est convertie en la chaîne "null" (quatre caractères ASCII n, u, l, l).
la source
Comme d'autres l'ont écrit, vous pouvez annuler tout. Normalement, vous n'en auriez pas besoin, vous pouvez écrire:
sans y mettre le casting.
Mais il y a des occasions où de tels lancements ont du sens:
a) si vous voulez vous assurer qu'une méthode spécifique est appelée, comme:
alors cela ferait une différence si vous tapez
b) si vous avez l'intention d'utiliser votre IDE pour générer du code; par exemple, j'écris généralement des tests unitaires comme:
Je fais du TDD; cela signifie que la classe "MyClassUnderTest" n'existe probablement pas encore. En écrivant ce code, je peux ensuite utiliser mon IDE pour générer d'abord la nouvelle classe; et pour générer ensuite un constructeur acceptant un argument "W Any" "prêt à l'emploi" - l'EDI peut comprendre à partir de mon test que le constructeur doit prendre exactement un argument de type Wthing.
la source
Imprimer :
ValueOf :
Il retournera simplement une chaîne avec la valeur "null" lorsque l'objet l'est
null
.la source
C'est très pratique lorsque vous utilisez une méthode qui serait autrement ambiguë. Par exemple: JDialog a des constructeurs avec les signatures suivantes:
J'ai besoin d'utiliser ce constructeur, car je veux définir la GraphicsConfiguration, mais je n'ai pas de parent pour cette boîte de dialogue, donc le premier argument doit être nul. En utilisant
est ambigu, donc dans ce cas, je peux restreindre l'appel en castant null à l'un des types pris en charge:
la source
Cette fonction de langue est pratique dans cette situation.
Si memberHashMap.get ("Name") renvoie null, vous souhaitez toujours que la méthode ci-dessus renvoie null sans lever d'exception. Quelle que soit la classe, null est null.
la source