Rumah  >  Artikel  >  Java  >  Apakah punca dan penyelesaian pengecualian java.lang.NullPointerException

Apakah punca dan penyelesaian pengecualian java.lang.NullPointerException

王林
王林ke hadapan
2023-05-17 19:17:582879semak imbas

    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.

    Apakah punca dan penyelesaian pengecualian java.lang.NullPointerException

    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 contoh

    Kod sampel adalah seperti berikut

    public 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.NullPointerException

    di Temp.main(Temp.java:7)

    Dilemparkan dalam pernyataan

    t.foo("Hi")Pengecualian; kerana NullPointerException ada t di sini. null

    2. NullPointerException berlaku apabila mengakses/mengubah suai medan objek nol

    Kod sampel-

    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.NullPointerException

    di Temp.main(Temp.java:9)

    Pengecualian

    dilemparkan dalam pernyataan int i = t.x; keranaNullPointerExceptionIni adalah t. null

    3. NullPointerException apabila menghantar null dalam parameter kaedah

    Kod contoh-

    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

    4. Throw java.lang.NullPointerException apabila null dilemparkan

    Kod sampel

    public class Temp {
        public static void main(String[] args) {
            throw null;
        }
    }
    Berikut ialah surih tindanan pengecualian program di atas, ia dilemparkan kerana

    throw nullPengecualian. NullPointerException

    Pengecualian dalam utas "utama" java.lang.NullPointerException

    di Temp.main(Temp.java:5)

    5. 获取null数组的长度时抛出java.lang.NullPointerException

    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)

    6. 访问null数组的索引值时出现NullPointerException

    示例代码 -

    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)

    7. 在null对象上同步时出现java.lang.NullPointerException

     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应用程序响应引发的错误消息。

    Apakah punca dan penyelesaian pengecualian java.lang.NullPointerException

    异常堆栈跟踪

     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

    如何检测java.lang.NullPointerException?

    检测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());
    }

    避免java.lang.NullPointerException的最佳编码实践

    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!

    Kenyataan:
    Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam