Rumah > Java > javaTutorial > teks badan

Apakah punca dan penyelesaian pengecualian java.lang.NullPointerException

王林
Lepaskan: 2023-05-17 19:17:58
ke hadapan
2873 orang telah melayarinya

    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());
        }
    }
    Salin selepas log masuk

    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;
        }
    }
    Salin selepas log masuk

    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());
        }
    }
    Salin selepas log masuk

    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;
        }
    }
    Salin selepas log masuk

    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;
        }
    }
    Salin selepas log masuk

    执行上面示例代码,得到以下结果 -

    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];
        }
    }
    Salin selepas log masuk

    执行上面示例代码,得到以下结果 -

    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");
            }
        }
    }
    Salin selepas log masuk

    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";
        }
    Salin selepas log masuk

    下图显示了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)
    Salin selepas log masuk

    根本原因是语句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");
    }
    Salin selepas log masuk

    示例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());
    }
    Salin selepas log masuk

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

    1 . 考虑下面的代码示例。

    public void foo(String s) {
        if(s.equals("Test")) {
            System.out.println("test");
        }
    }
    Salin selepas log masuk

    2 . 现在,如果将null作为s参数的值传递,则会发生NullPointerException异常。可以如下编写相同的方法以避免NullPointerException

    public void foo(String s) {
        if ("Test".equals(s)) {
            System.out.println("test");
        }
    }
    Salin selepas log masuk

    3 . 需要为参数添加null检查,并在需要时抛出IllegalArgumentException异常。

    public int getArrayLength(Object[] array) {
        if(array == null) throw new IllegalArgumentException("array is null");
        return array.length;
    }
    Salin selepas log masuk

    4 . 使用三元运算符,如下面的示例代码所示。

    String msg = (str == null) ? "" : str.substring(0, str.length()-1);
    Salin selepas log masuk

    5 . 使用String.valueOf()而不是toString()方法。例如,检查PrintStream println()方法代码定义如下。

    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }
    Salin selepas log masuk

    6 . 下面显示了使用valueOf()方法而非toString()的示例。

    Object mutex = null;//prints nullSystem.out.println(String.valueOf(mutex));//will throw java.lang.NullPointerExceptionSystem.out.println(mutex.toString());
    Salin selepas log masuk

    7 . 写入方法尽可能返回空对象而不是null,例如空列表,空字符串等。
    8 . 应该使用在集合类中定义了一些用来避免NullPointerException的方法。例如

    contains(),containsKey()和containsValue()。
    Salin selepas log masuk

    这是关于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!

    sumber:yisu.com
    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan