NullPointerException
是當(dāng)您嘗試使用指向內(nèi)存中任何位置 (null) 的引用時(shí)發(fā)生的異常,就像引用對(duì)象一樣。對(duì)空引用調(diào)用方法或嘗試訪問(wèn)空引用的字段將觸發(fā) NullPointerException
。這些是最常見(jiàn)的,但 中列出了其他方法NullPointerException
page javadoc.
L'exemple de code le plus rapide auquel je puisse penser pour illustrer une NullPointerException est probablement?:
public class Example { public static void main(String[] args) { Object obj = null; obj.hashCode(); } }
dans main
內(nèi)的第一行,我顯式地將 Object
引用 obj
設(shè)置為 null
。這意味著我有一個(gè)引用,但它沒(méi)有指向任何對(duì)象。之后,我嘗試通過(guò)調(diào)用該引用的方法來(lái)將該引用視為指向一個(gè)對(duì)象。這會(huì)導(dǎo)致 NullPointerException
car il n'y a pas de code à exécuter à l'emplacement pointé par la référence.
(C'est une question technique, mais je pense que cela vaut la peine de le mentionner?: une référence à null n'est pas la même chose qu'un pointeur C pointant vers un emplacement mémoire invalide. Un pointeur nul ne pointe nulle part , ce qui est la même chose comme pointant vers un emplacement qui s'avère être invalide. Différence subtile)
Il existe deux principaux types de variables en Java?:
Primitives?:?Variables contenant des données. Si vous souhaitez manipuler les données de la variable d'origine, vous pouvez manipuler la variable directement. Par convention, les types primitifs commencent par une lettre minuscule. Par exemple, les variables de type int
或 char
sont des primitives.
Référence?: Une variable contenant l'adresse mémoire d'un Objet
, c'est-à-dire une variable qui 對(duì)象
內(nèi)存地址的變量,即引用對(duì)象的變量代碼>.如果您想要操作引用變量引用的Object
,則必須取消引用它。取消引用通常需要使用 .
訪問(wèn)方法或字段,或使用 [
索引數(shù)組。按照慣例,引用類型通常用以大寫字母開(kāi)頭的類型來(lái)表示。例如,Object
référence à un
. >Objet
référencé par le code variable de référence>, vous devez le le. Le déréférencement nécessite généralement l'utilisation de .
pour accéder à une méthode ou à un champ, ou de [
pour indexer un tableau. Par convention, les types référence sont généralement représentés par le type commen?ant par une lettre majuscule. Par exemple, les variables de type Object
sont des références. int
rawx
指定任何值,而我們正在嘗試使用 x
的值來(lái)指定 y
de type
int x; int y = x + x;Ces deux lignes feront planter le programme car il n'y a pas de >. Toutes les primitives doivent être initialisées à des valeurs utilisables avant de pouvoir être manipulées.
null
,這意味著“我沒(méi)有引用任何東西”。如果您以這種方式顯式設(shè)置引用變量,則可以在引用變量中獲取 null
值,或者引用變量未初始化并且編譯器不會(huì)捕獲它(Java 會(huì)自動(dòng)將該變量設(shè)置為 null
Maintenant, les choses deviennent intéressantes. RéférencesLes variables peuvent être définies sur null
, ce qui signifie "Je ne fais référence à rien ". Si vous définissez explicitement une variable de référence de cette manière, vous pouvez obtenir une valeur null
dans la variable de référence, ou la variable de référence n'est pas initialisée et le compilateur ne l'attrape pas (Java définit automatiquement la variable à null
). NullPointerException
de la déréférencer NullPointerException
, vous obtiendrez un
se produit généralement lorsque vous déclarez une variable mais que vous ne créez pas et n'attribuez pas l'objet à la variable avant d'essayer d'utiliser le contenu de la variable
(NPE). Vous faites donc référence à quelque chose qui n’existe pas réellement. num
的變量,但它實(shí)際上還不包含引用值。由于您還沒(méi)有說(shuō)出要指向什么,Java 將其設(shè)置為 null
Integer num; num = new Integer(10);
new
關(guān)鍵字用于實(shí)例化(或創(chuàng)建)一個(gè)Integer
類型的對(duì)象,引用變量num
被分配給該 Integer
La première ligne déclare un fichier nommé .
num
,,您將得到一個(gè)NullPointerException
。在最簡(jiǎn)單的情況下,編譯器會(huì)捕獲問(wèn)題并讓您知道“num 可能尚未初始化
Deuxième ligne,
Si vous essayez de déréférencer
num
avant de créer l'objet, obj
,而是假設(shè)它是在調(diào)用 doSomething()
vous obtiendrez un
num n'a peut-être pas été initialisé
", mais parfois vous pouvez écrire du code qui ne crée pas directement l'objet. ??
??Par exemple, vous pourriez avoir la méthode suivante?: ??
public void doSomething(SomeObject obj) { // Do something to obj, assumes obj is not null obj.myMethod(); }??Dans ce cas, vous ne créez pas l'objet qui a été créé avant la méthode ??. Notez que la méthode peut être appelée comme ceci : ??
doSomething(null);
Dans ce cas, obj
為 null
,并且語(yǔ)句 obj.myMethod()
將拋出 NullPointerException
>.
Si la méthode a l'intention d'effectuer une opération sur l'objet transmis comme la méthode ci-dessus, lancer NullPointerException
est approprié car il s'agit d'une erreur du programmeur et le programmeur a besoin de ces informations à des fins de débogage.
En plus des NullPointerException
異常之外,您還可以檢查方法參數(shù)中的 null
exceptions levées en raison de la logique de la méthode, vous pouvez également vérifier la valeur
// Throws an NPE with a custom error message if obj is null Objects.requireNonNull(obj, "obj must not be null");Notez qu'il serait utile d'indiquer explicitement quel
null
objet ne peut pas être dans le message d'erreur. Les avantages de cette validation sont que 1) vous pouvez renvoyer votre propre message d'erreur plus clair, 2) pour le reste de la méthode, vous savez qu'à moins que obj ne soit réaffecté, il n'est pas nul et peut être déréférencé en toute sécurité .
Alternativement, dans certains cas, le but de la méthode n'est pas seulement d'opérer sur l'objet transmis, donc un paramètre vide peut être acceptable. Dans ce cas, vous devez vérifier le paramètre nuldoSomething()
et vous comporter différemment. Vous devez également expliquer cela dans la documentation. Par exemple,
/** * @param obj An optional foo for ____. May be null, in which case * the result will be ____. */ public void doSomething(SomeObject obj) { if(obj == null) { // Do something } else { // Do something else } }Enfin, Comment utiliser les traces de pile pour identifier les exceptions et les causes
Maintenant, Java 14 ajoute une nouvelle fonctionnalité de langage pour afficher la cause première de NullPointerException. Cette fonctionnalité linguistique fait partie de SAP Business JVM depuis 2006.
En Java 14, voici un exemple de message d'exception NullPointerException?:
NullPointerException
Liste des situations qui provoquent que
NullPointerException
Voici toutes les situations où
拋出空值;
synchronized (someNullReference) { ... }
Sync sur null - NullPointerException
Tout opérateur entier/virgule flottante peut être lancé si l'un de ses opérandes est une référence nulle encadrée NullPointerException
La conversion de déballage augmente super
會(huì)引發(fā) NullPointerException
Appeler super
sur une référence nulle augmente class Outer { class Inner {} } class ChildOfInner extends Outer.Inner { ChildOfInner(Outer o) { o.super(); // if o is null, NPE gets thrown } }
for (element : iterable)
Utilisez
switch (foo) { ... }
(無(wú)論是表達(dá)式還是語(yǔ)句)在 foo
時(shí)可以拋出 NullPointerException
est vide.
foo.new SomeInnerClass()
當(dāng) foo
為 null 時(shí)拋出 NullPointerException
.
name1::name2
或 primaryExpression::name
形式的方法引用在以下情況下求值時(shí)會(huì)拋出 NullPointerException
name1 或 primaryExpression
est évalué à null.
La note de JLS indique que someInstance.someStaticMethod()
不會(huì)拋出 NPE,因?yàn)?someStaticMethod
是靜態(tài)的,但 someInstance:: someStaticMethod
lance toujours du NPE?!
* Attention, JLS peut aussi indirectement parler beaucoup de NPE.