java.lang.NullPointerException
ialah salah satu pengecualian yang paling biasa dalam pengaturcaraan java. Sesiapa sahaja yang menggunakan Java telah melihat java.lang.NullPointerException
pengecualian dalam program Java serta aplikasi web Java.
NullPointerException
ialah pengecualian masa jalan, jadi tidak perlu menangkapnya dalam program.
Apabila cuba melakukan operasi tertentu pada objek null
, pengecualian NullPointerException
dilemparkan dalam aplikasi. Berikut ialah beberapa sebab biasa mengapa NullPointerException
pengecualian berlaku dalam program java -
kaedah dipanggil pada contoh objek, tetapi pada masa jalan objek ialah null
.
mengakses pembolehubah tika objek yang null
pada masa jalan.
melontar null
dalam program.
Tatasusunan untuk mengakses indeks atau mengubah suai indeks ialah null
.
Menyemak panjang tatasusunan iaitu null
pada masa jalan.
Artikel ini terutamanya memperkenalkan beberapa sebab dan penyelesaian untuk berlakunya java.lang.NullPointerException Artikel ini memperkenalkan anda dengan terperinci dan mempunyai rujukan tertentu untuk kajian atau kerja anda , rakan-rakan yang memerlukan boleh merujuknya
Dalam pengaturcaraan Java, NullPointerException ialah pengecualian masa jalan biasa Sebab-sebab kejadiannya mungkin termasuk:
Kaedah untuk mengelakkan NullPointerException dalam pengaturcaraan Java termasuk:
1. Mulakan pembolehubah rentetan. 2. Gunakan kelas tertentu untuk memulakan objek jenis antara muka. 3. Lakukan pemprosesan penghakiman batal apabila objek kosong. 4. Elakkan menggunakan nilai nol untuk perbandingan rentetan. 5. Gunakan kaedah String.valueOf() dan bukannya kaedah toString() untuk mengelak daripada membuang NullPointerException apabila rujukan adalah nol. 6. Buat seketika objek jenis kelas dan kemudian panggilnya. 7. Nilai pulangan boleh ditakrifkan sebagai tatasusunan untuk mengelakkan NullPointerException disebabkan oleh mengembalikan nilai nol. Untuk memastikan keteguhan dan kestabilan program, anda harus mencuba sedaya upaya untuk mengelakkan situasi di atas semasa pengaturcaraan. Untuk memastikan ketepatan dan kestabilan kod, kita harus mengambil operasi batal atau mengikuti tabiat pengaturcaraan yang selamat apabila berhadapan dengan situasi yang tidak dapat dielakkan. NullPointerException ialah pengecualian masa jalan dalam Java, yang biasanya berlaku apabila cuba mengakses rujukan nol (iaitu, pembolehubah tanpa ruang memori yang diperuntukkan). Jika anda cuba mengendalikan objek nol, program akan membuang pengecualian NullPointerException. Untuk mengelakkan pengecualian ini, kita boleh melakukan semakan nilai nol (iaitu penghakiman nol) sebelum menggunakannya, atau memperuntukkan ruang memori kepada pembolehubah dan menetapkannya sebagai nilai awal. Sebagai contoh, apabila menilai sama ada contoh jenis String s adalah sama dengan "a", ia harus ditulis sebagai "a".sama dengan(s) dan bukannya s.equals("a"), kerana bekas boleh menghalang s daripada menjadi situasi Null, dengan itu mengelakkan berlakunya NullPointerException. Untuk mengelakkan daripada mengembalikan nilai nol, nilai pulangan kaedah boleh ditakrifkan sebagai jenis tatasusunan. Jika anda perlu mengembalikan nilai nol, anda boleh mengembalikan tatasusunan kosong. Ringkasnya, kunci untuk mengelakkan NullPointerException adalah untuk membatalkan sepenuhnya dan memulakan pembolehubah, cuba elakkan menggunakan nilai nol dan mengamalkan tabiat pengaturcaraan yang selamat untuk mengelakkan pengecualian ini. Beberapa contoh pengecualian NullPointerException dalam program java. 1. NullPointerException berlaku apabila memanggil kaedah contohKod sampel adalah seperti berikutpublic class Temp { public static void main(String[] args) { Temp t = initT(); t.foo("Hi"); } private static Temp initT() { return null; } public void foo(String s) { System.out.println(s.toLowerCase()); } }Apabila program di atas dijalankan, ia akan membuang
mesej ralat pengecualian . NullPointerException
Pengecualian dalam utas "utama" java.lang.NullPointerExceptionDilemparkan dalam pernyataandi Temp.main(Temp.java:7)
t.foo("Hi")
Pengecualian; kerana NullPointerException
ada t
di sini. null
public class Temp { public int x = 10; public static void main(String[] args) { Temp t = initT(); int i = t.x; } private static Temp initT() { return null; } }Laksanakan kod sampel di atas dan dapatkan keputusan berikut-
Pengecualian dalam utas "utama" java.lang.NullPointerExceptionPengecualiandi Temp.main(Temp.java:9)
dilemparkan dalam pernyataan int i = t.x
; keranaNullPointerException
Ini adalah t
. null
public class Temp { public static void main(String[] args) { foo(null); } public static void foo(String s) { System.out.println(s.toLowerCase()); } }Ini adalah salah satu kes yang paling biasa bagi
kerana ia melepasi parameter java.lang.NullPointerException
kepada pemanggil. null
public class Temp { public static void main(String[] args) { throw null; } }Berikut ialah surih tindanan pengecualian program di atas, ia dilemparkan kerana
throw null
Pengecualian. NullPointerException
Pengecualian dalam utas "utama" java.lang.NullPointerExceptiondi Temp.main(Temp.java:5)
public class Temp { public static void main(String[] args) { int[] data = null; int len = data.length; } }
执行上面示例代码,得到以下结果 -
Exception in thread "main" java.lang.NullPointerException
at Temp.main(Temp.java:7)
示例代码 -
public class Temp { public static void main(String[] args) { int[] data = null; int len = data[2]; } }
执行上面示例代码,得到以下结果 -
Exception in thread "main" java.lang.NullPointerException
at Temp.main(Temp.java:7)
public class Temp { public static String mutex = null; public static void main(String[] args) { synchronized(mutex) { System.out.println("synchronized block"); } } }
synchronized(mutex)
将抛出NullPointerException
,因为mutex
对象为null
。
8. java.lang.NullPointerException引发HTTP状态500
有时会将错误页面作为java Web应用程序响应发送,错误消息为“HTTP状态500 - 内部服务器错误”,根本原因就是java.lang.NullPointerException
异常。
下面是一段编辑了Spring MVC Example项目并更改了HomeController
方法,如下所示。
@RequestMapping(value = "/user", method = RequestMethod.POST) public String user(@Validated User user, Model model) { System.out.println("User Page Requested"); System.out.println("User Name: "+user.getUserName().toLowerCase()); System.out.println("User ID: "+user.getUserId().toLowerCase()); model.addAttribute("userName", user.getUserName()); return "user"; }
下图显示了Web应用程序响应引发的错误消息。
异常堆栈跟踪
HTTP Status 500 – Internal Server Error Type Exception Report Message Request processing failed; nested exception is java.lang.NullPointerException Description The server encountered an unexpected condition that prevented it from fulfilling the request. Exception org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) javax.servlet.http.HttpServlet.service(HttpServlet.java:661) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) Root Cause java.lang.NullPointerException com.journaldev.spring.controller.HomeController.user(HomeController.java:38) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498)
根本原因是语句user.getUserId().toLowerCase()
中引发了NullPointerException
,因为user.getUserId()
返回null
。
检测NullPointerException
非常简单,只需查看异常跟踪,它将显示异常的类名和行号。然后查看代码并查看可能为null
。只要看一下上面的所有例子,从堆栈跟踪中可以清楚地看出是什么导致了null
指针异常。
如何修复java.lang.NullPointerException异常
java.lang.NullPointerException
是一个未经检查的异常,因此不必捕获它。通常可以使用空检查和预防性编码技术来防止空指针异常。请看下面的代码示例,演示如何避免java.lang.NullPointerException
异常。
示例1
if(mutex ==null) mutex =""; //preventive coding synchronized(mutex) { System.out.println("synchronized block"); }
示例2
//using null checks if(user!=null && user.getUserName() !=null) { System.out.println("User Name: "+user.getUserName().toLowerCase()); } if(user!=null && user.getUserName() !=null) { System.out.println("User ID: "+user.getUserId().toLowerCase()); }
1 . 考虑下面的代码示例。
public void foo(String s) { if(s.equals("Test")) { System.out.println("test"); } }
2 . 现在,如果将null
作为s
参数的值传递,则会发生NullPointerException
异常。可以如下编写相同的方法以避免NullPointerException
。
public void foo(String s) { if ("Test".equals(s)) { System.out.println("test"); } }
3 . 需要为参数添加null
检查,并在需要时抛出IllegalArgumentException
异常。
public int getArrayLength(Object[] array) { if(array == null) throw new IllegalArgumentException("array is null"); return array.length; }
4 . 使用三元运算符,如下面的示例代码所示。
String msg = (str == null) ? "" : str.substring(0, str.length()-1);
5 . 使用String.valueOf()
而不是toString()
方法。例如,检查PrintStream println()
方法代码定义如下。
public void println(Object x) { String s = String.valueOf(x); synchronized (this) { print(s); newLine(); } }
6 . 下面显示了使用valueOf()
方法而非toString()
的示例。
Object mutex = null;//prints nullSystem.out.println(String.valueOf(mutex));//will throw java.lang.NullPointerExceptionSystem.out.println(mutex.toString());
7 . 写入方法尽可能返回空对象而不是null
,例如空列表,空字符串等。
8 . 应该使用在集合类中定义了一些用来避免NullPointerException
的方法。例如
contains(),containsKey()和containsValue()。
这是关于java中的NullPointerException
异常的所有情况。希望它能帮助您编写更好的代码,以尽可能避免java.lang.NullPointerException
异常。
Atas ialah kandungan terperinci Apakah punca dan penyelesaian pengecualian java.lang.NullPointerException. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!