Rumah > Soal Jawab > teks badan
P粉2521165872023-08-24 09:14:35
NullPointerException
是当您尝试使用指向内存中任何位置 (null) 的引用时发生的异常,就像引用对象一样。对空引用调用方法或尝试访问空引用的字段将触发 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
内的第一行,我显式地将 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 )
P粉5935361042023-08-24 00:10:48
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 对象
内存地址的变量,即引用对象的变量代码>.如果您想要操作引用变量引用的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 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
,这意味着“我没有引用任何东西”。如果您以这种方式显式设置引用变量,则可以在引用变量中获取 null
值,或者引用变量未初始化并且编译器不会捕获它(Java 会自动将该变量设置为 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
的变量,但它实际上还不包含引用值。由于您还没有说出要指向什么,Java 将其设置为 null
Gunakan kod berikut:
Integer num; num = new Integer(10);
Baris pertama mengisytiharkan fail bernama new
关键字用于实例化(或创建)一个Integer
类型的对象,引用变量num
被分配给该 Integer
.
Barisan kedua, num
,,您将得到一个NullPointerException
。在最简单的情况下,编译器会捕获问题并让您知道“num 可能尚未初始化
objek.
Jika anda cuba menyahrujuk
anda akan mendapat 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.
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
异常之外,您还可以检查方法参数中的 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
会引发 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) { ... }
(无论是表达式还是语句)在 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.