Rumah  >  Soal Jawab  >  teks badan

Apakah NullPointerException dan bagaimana untuk membetulkannya?

<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>
P粉649990273P粉649990273393 hari yang lalu544

membalas semua(2)saya akan balas

  • P粉252116587

    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 )

    balas
    0
  • P粉593536104

    P粉5935361042023-08-24 00:10:48

    Terdapat dua jenis pembolehubah utama di Jawa:

    1. 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 intchar adalah primitif.

    2. Reference: Pembolehubah yang mengandungi alamat memori objek , iaitu, pembolehubah yang mengutamakan 对象内存地址的变量,即引用对象的变量代码>.如果您想要操作引用变量引用的Object,则必须取消引用它。取消引用通常需要使用 . 访问方法或字段,或使用 [ 索引数组。按照惯例,引用类型通常用以大写字母开头的类型来表示。例如,ObjectObject

      Code>. >Objek yang dirujuk oleh kod pembolehubah rujukan>, anda mesti
    3. dereference
    itu. Penyahrujukan biasanya memerlukan penggunaan . 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

    mentah

    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.

    Rujukan

    pembolehubah boleh ditetapkan kepada null, yang bermaksud "Saya tidak merujuk apa-apa ". Jika anda secara eksplisit menetapkan pembolehubah rujukan dengan cara ini, anda boleh mendapatkan nilai null dalam pembolehubah rujukan, atau pembolehubah rujukan tidak dimulakan dan pengkompil tidak menangkapnya (Java menetapkan pembolehubah secara automatik kepada null). NullPointerExceptionJika anda menetapkan pembolehubah rujukan kepada null, sama ada secara eksplisit atau automatik melalui Java, dan anda mencuba

    untuk nyahrujuk

    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 将其设置为 nullGunakan 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 nombor sebelum mencipta objek,

    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.

    🎜Sebagai contoh, anda mungkin mempunyai kaedah berikut: 🎜
    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, objnull,并且语句 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

    dalam parameter kaedah dan secara eksplisit membuang NPE dengan menambahkan sesuatu seperti: berhampiran permulaan kaedah berikut:

    // 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 nullobjek 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,

    boleh ditulis sebagai:

    /**
      * @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

    Sonar dengan keupayaan mencari pepijat boleh mengesan NPE. Boleh sonar secara dinamik menangkap pengecualian penuding nol yang disebabkan oleh JVM

    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:

    NullPointerExceptionSenarai situasi yang menyebabkan

    berlaku

    NullPointerExceptionBerikut adalah semua situasi di mana

    berlaku secara langsung* yang disebut oleh Spesifikasi Bahasa Java:
    • Akses (iaitu dapatkan atau tetapkan) medan contoh
    • rujukan nol. (Medan statik tidak dikira!)
    • Panggil instance
    • kaedah rujukan batal. (Kaedah statik tidak dikira!)
    • 抛出空值;
    • Akses elemen tatasusunan kosong.
    • synchronized (someNullReference) { ... }Segerakkan pada nol -
    • NullPointerExceptionMana-mana pengendali integer/titik terapung boleh melontar jika salah satu operannya ialah rujukan nol berkotak
    • NullPointerExceptionPenukaran unboxing meningkat
    • jika nilai kotak adalah batal.
    • super 会引发 NullPointerExceptionMemanggil super pada rujukan batal meningkatkan
    • . Jika anda keliru, ini bercakap tentang panggilan pembina kelas super yang layak:
      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

      gelung untuk mengulung pada koleksi/tatasusunan kosong. 🎜
    • switch (foo) { ... }(无论是表达式还是语句)在 foo 时可以抛出 NullPointerException kosong.

    • foo.new SomeInnerClass()foo 为 null 时抛出 NullPointerException.

    • name1::name2primaryExpression::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.

    balas
    0
  • Batalbalas