NullPointerException
是當(dāng)您嘗試使用指向內(nèi)存中任何位置 (null) 的引用時(shí)發(fā)生的異常,就像引用對(duì)象一樣。對(duì)空引用調(diào)用方法或嘗試訪問空引用的字段將觸發(fā) NullPointerException
。這些是最常見的,但 中列出了其他方法NullPointerException
halaman javadoc.
Kod contoh terpantas yang boleh saya fikirkan untuk menggambarkan NullPointerException mungkin:
public class Example { public static void main(String[] args) { Object obj = null; obj.hashCode(); } }
dalam main
內(nèi)的第一行,我顯式地將 Object
引用 obj
設(shè)置為 null
。這意味著我有一個(gè)引用,但它沒有指向任何對(duì)象。之后,我嘗試通過調(diào)用該引用的方法來將該引用視為指向一個(gè)對(duì)象。這會(huì)導(dǎo)致 NullPointerException
kerana tiada kod untuk dilaksanakan di lokasi yang ditunjukkan oleh rujukan.
(Ini soalan teknikal, tetapi saya fikir ia patut disebut: rujukan kepada null tidak sama dengan penunjuk C yang menunjuk ke lokasi memori yang tidak sah. Penunjuk nol sebenarnya tidak menghala ke mana-mana , yang sama sebagai menunjuk kepada lokasi yang kebetulan tidak sah Perbezaan halus )
Terdapat dua jenis pembolehubah utama di Jawa:
Primitif: Pembolehubah yang mengandungi data. Jika anda ingin memanipulasi data dalam pembolehubah asal, anda boleh memanipulasi pembolehubah secara langsung. Mengikut konvensyen, jenis primitif bermula dengan huruf kecil. Contohnya, pembolehubah jenis int
或 char
adalah primitif.
Reference: Pembolehubah yang mengandungi alamat memori objek
, iaitu, pembolehubah yang mengutamakan 對(duì)象
內(nèi)存地址的變量,即引用對(duì)象的變量代碼>.如果您想要操作引用變量引用的Object
,則必須取消引用它。取消引用通常需要使用 .
訪問方法或字段,或使用 [
索引數(shù)組。按照慣例,引用類型通常用以大寫字母開頭的類型來表示。例如,Object
Object
.
untuk mengakses kaedah atau medan, atau [
untuk mengindeks tatasusunan. Mengikut konvensyen, jenis rujukan biasanya diwakili oleh jenis yang bermula dengan huruf besar. Contohnya, pembolehubah jenis Object
ialah rujukan.
int
Pertimbangkan kod berikut, di mana anda mengisytiharkan pembolehubah
jenis x
指定任何值,而我們正在嘗試使用 x
的值來指定 y
tetapi jangan memulakannya:
int x; int y = x + x;
Dua baris ini akan ranap program kerana tiada >. Semua primitif mesti dimulakan kepada nilai yang boleh digunakan sebelum ia boleh dimanipulasi.
null
,這意味著“我沒有引用任何東西”。如果您以這種方式顯式設(shè)置引用變量,則可以在引用變量中獲取 null
值,或者引用變量未初始化并且編譯器不會(huì)捕獲它(Java 會(huì)自動(dòng)將該變量設(shè)置為 null
Sekarang perkara menjadi menarik.
pembolehubah boleh ditetapkan kepada null
dalam pembolehubah rujukan, atau pembolehubah rujukan tidak dimulakan dan pengkompil tidak menangkapnya (Java menetapkan pembolehubah secara automatik kepada null
).
NullPointerException
Jika anda menetapkan pembolehubah rujukan kepada null, sama ada secara eksplisit atau automatik melalui Java, dan anda mencuba
nya, anda akan mendapat NullPointerException
.
biasanya berlaku apabila anda mengisytiharkan pembolehubah tetapi tidak mencipta objek dan menetapkannya kepada pembolehubah sebelum cuba menggunakan kandungan pembolehubah
(NPE). Jadi anda merujuk sesuatu yang sebenarnya tidak wujud.
num
的變量,但它實(shí)際上還不包含引用值。由于您還沒有說出要指向什么,Java 將其設(shè)置為 null
Gunakan kod berikut:
Integer num; num = new Integer(10);
Baris pertama mengisytiharkan fail bernama new
關(guān)鍵字用于實(shí)例化(或創(chuàng)建)一個(gè)Integer
類型的對(duì)象,引用變量num
被分配給該 Integer
.
Barisan kedua, num
,,您將得到一個(gè)NullPointerException
。在最簡單的情況下,編譯器會(huì)捕獲問題并讓您知道“num 可能尚未初始化
objek.
Jika anda cuba menyahrujuk
anda akan mendapat obj
,而是假設(shè)它是在調(diào)用 doSomething()
. Dalam kes paling mudah, pengkompil akan menangkap masalah dan memberitahu anda "num mungkin tidak dimulakan
", tetapi kadangkala anda mungkin menulis kod yang tidak mencipta objek secara langsung.
public void doSomething(SomeObject obj) { // Do something to obj, assumes obj is not null obj.myMethod(); }??Dalam kes ini, anda tidak mencipta objek yang dicipta sebelum kaedah ??. Perhatikan bahawa kaedahnya boleh dipanggil seperti ini: ??
doSomething(null);
Dalam kes ini, obj
為 null
,并且語句 obj.myMethod()
將拋出 NullPointerException
>.
Jika kaedah bercadang untuk melakukan beberapa operasi pada objek yang dihantar seperti kaedah di atas, melontar NullPointerException
adalah sesuai kerana ini adalah ralat pengaturcara dan pengaturcara memerlukan maklumat tersebut untuk tujuan penyahpepijatan.
Sebagai tambahan kepada NullPointerException
異常之外,您還可以檢查方法參數(shù)中的 null
pengecualian yang dilemparkan kerana logik kaedah, anda juga boleh menyemak nilai
// Throws an NPE with a custom error message if obj is null Objects.requireNonNull(obj, "obj must not be null");Perhatikan bahawa adalah berguna untuk menyatakan secara eksplisit yang
null
objek tidak boleh dalam mesej ralat. Kelebihan mengesahkan ini ialah 1) anda boleh mengembalikan mesej ralat anda yang lebih jelas, 2) untuk kaedah lain yang anda tahu bahawa melainkan obj ditetapkan semula, ia tidak batal dan boleh dinyahrujuk dengan selamat
Sebagai alternatif, dalam beberapa kes, tujuan kaedah bukan hanya untuk beroperasi pada objek yang dihantar masuk, jadi parameter kosong mungkin boleh diterima. Dalam kes ini, anda perlu menyemak null parameterdoSomething()
dan berkelakuan secara berbeza. Anda juga harus menerangkan perkara ini dalam dokumentasi. Contohnya,
/** * @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 } }Akhir sekali, Cara menggunakan surih tindanan untuk menentukan pengecualian dan punca
Kini Java 14 menambah ciri bahasa baharu untuk menunjukkan punca utama NullPointerException. Ciri bahasa ini telah menjadi sebahagian daripada JVM Perniagaan SAP sejak 2006.
Dalam Java 14, berikut ialah contoh mesej pengecualian NullPointerException:
NullPointerException
Senarai situasi yang menyebabkan
NullPointerException
Berikut adalah semua situasi di mana
拋出空值;
synchronized (someNullReference) { ... }
Segerakkan pada nol - NullPointerException
Mana-mana pengendali integer/titik terapung boleh melontar jika salah satu operannya ialah rujukan nol berkotak NullPointerException
Penukaran unboxing meningkat super
會(huì)引發(fā) NullPointerException
Memanggil super
pada rujukan batal meningkatkan class Outer { class Inner {} } class ChildOfInner extends Outer.Inner { ChildOfInner(Outer o) { o.super(); // if o is null, NPE gets thrown } }
for (element : iterable)
Gunakan
switch (foo) { ... }
(無論是表達(dá)式還是語句)在 foo
時(shí)可以拋出 NullPointerException
kosong.
foo.new SomeInnerClass()
當(dāng) foo
為 null 時(shí)拋出 NullPointerException
.
name1::name2
或 primaryExpression::name
形式的方法引用在以下情況下求值時(shí)會(huì)拋出 NullPointerException
name1 或 primaryExpression
menilai kepada batal.
Nota dari JLS menyatakan bahawa someInstance.someStaticMethod()
不會(huì)拋出 NPE,因?yàn)?someStaticMethod
是靜態(tài)的,但 someInstance:: someStaticMethod
masih membuang NPE!
* Sila ambil perhatian bahawa JLS juga mungkin secara tidak langsung banyak bercakap tentang NPE.