Apakah NullPointerException dan bagaimana untuk membetulkannya?
P粉649990273
2023-08-23 10:22:08
<p>Apakah Pengecualian Penunjuk Null (<kod>java.lang.NullPointerException</code>) dan apakah puncanya? </p>
<p>Apakah kaedah/alat yang boleh digunakan untuk menentukan punca supaya pengecualian boleh dihalang daripada menyebabkan program ditamatkan lebih awal? </p>
NullPointerException
是当您尝试使用指向内存中任何位置 (null) 的引用时发生的异常,就像引用对象一样。对空引用调用方法或尝试访问空引用的字段将触发NullPointerException
。这些是最常见的,但 中列出了其他方法NullPointerException
halaman javadoc.Kod contoh terpantas yang boleh saya fikirkan untuk menggambarkan NullPointerException mungkin:
dalam
main
内的第一行,我显式地将Object
引用obj
设置为null
。这意味着我有一个引用,但它没有指向任何对象。之后,我尝试通过调用该引用的方法来将该引用视为指向一个对象。这会导致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
Code>. >Objek yang dirujuk oleh kod pembolehubah rujukan>, anda mestiobjek
, iaitu, pembolehubah yang mengutamakan对象
内存地址的变量,即引用对象的变量代码>.如果您想要操作引用变量引用的Object
,则必须取消引用它。取消引用通常需要使用.
访问方法或字段,或使用[
索引数组。按照惯例,引用类型通常用以大写字母开头的类型来表示。例如,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 jenisObject
ialah rujukan.int
Pertimbangkan kod berikut, di mana anda mengisytiharkan pembolehubahjenis
x
指定任何值,而我们正在尝试使用x
的值来指定y
tetapi jangan memulakannya:Dua baris ini akan ranap program kerana tiada >. Semua primitif mesti dimulakan kepada nilai yang boleh digunakan sebelum ia boleh dimanipulasi.
Rujukannull
,这意味着“我没有引用任何东西”。如果您以这种方式显式设置引用变量,则可以在引用变量中获取null
值,或者引用变量未初始化并且编译器不会捕获它(Java 会自动将该变量设置为null
Sekarang perkara menjadi menarik.pembolehubah boleh ditetapkan kepadanull, yang bermaksud "Saya tidak merujuk apa-apa ". Jika anda secara eksplisit menetapkan pembolehubah rujukan dengan cara ini, anda boleh mendapatkan nilai
untuk nyahrujuknull
dalam pembolehubah rujukan, atau pembolehubah rujukan tidak dimulakan dan pengkompil tidak menangkapnya (Java menetapkan pembolehubah secara automatik kepadanull
).NullPointerException
Jika anda menetapkan pembolehubah rujukan kepada null, sama ada secara eksplisit atau automatik melalui Java, dan anda mencubanya, 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
的变量,但它实际上还不包含引用值。由于您还没有说出要指向什么,Java 将其设置为null
Gunakan kod berikut:Baris pertama mengisytiharkan fail bernama
new
关键字用于实例化(或创建)一个Integer
类型的对象,引用变量num
被分配给该Integer
.Barisan kedua,
num
,,您将得到一个NullPointerException
。在最简单的情况下,编译器会捕获问题并让您知道“num 可能尚未初始化
objek.Jika anda cuba menyahrujuknombor sebelum mencipta objek,
anda akan mendapat
🎜Sebagai contoh, anda mungkin mempunyai kaedah berikut: 🎜 🎜Dalam kes ini, anda tidak mencipta objek yang dicipta sebelum kaedah 🎜. Perhatikan bahawa kaedahnya boleh dipanggil seperti ini: 🎜obj
,而是假设它是在调用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.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
dalam parameter kaedah dan secara eksplisit membuang NPE dengan menambahkan sesuatu seperti: berhampiran permulaan kaedah berikut:NullPointerException
异常之外,您还可以检查方法参数中的null
pengecualian yang dilemparkan kerana logik kaedah, anda juga boleh menyemak nilainull
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 selamatSebagai 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 parameter
boleh ditulis sebagai:doSomething()
dan berkelakuan secara berbeza. Anda juga harus menerangkan perkara ini dalam dokumentasi. Contohnya,Sonar dengan keupayaan mencari pepijat boleh mengesan NPE. 一个>Boleh sonar secara dinamik menangkap pengecualian penuding nol yang disebabkan oleh JVM
NullPointerException
Senarai situasi yang menyebabkanNullPointerException
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 berkotakNullPointerException
Penukaran unboxing meningkatsuper
会引发NullPointerException
Memanggilsuper
pada rujukan batal meningkatkan
gelung untuk mengulung pada koleksi/tatasusunan kosong. 🎜for (element : iterable)
Gunakanswitch (foo) { ... }
(无论是表达式还是语句)在foo
时可以抛出NullPointerException
kosong.foo.new SomeInnerClass()
当foo
为 null 时抛出NullPointerException
.name1::name2
或primaryExpression::name
形式的方法引用在以下情况下求值时会抛出NullPointerException
name1 或primaryExpression
menilai kepada batal.Nota dari JLS menyatakan bahawa
someInstance.someStaticMethod()
不会抛出 NPE,因为someStaticMethod
是静态的,但someInstance:: someStaticMethod
masih membuang NPE!* Sila ambil perhatian bahawa JLS juga mungkin secara tidak langsung banyak bercakap tentang NPE.