JavaRush /Blog Java /Random-MS /Coffee break #98. Pengecualian Nullpointer baharu dalam J...

Coffee break #98. Pengecualian Nullpointer baharu dalam Java 17. Apakah maksud dalam Java?

Diterbitkan dalam kumpulan

Pengecualian Nullpointer baharu dalam Java 17

Sumber: Dev.to Setiap pembangun Java harus mengetahui tentang kewujudan Nullpointer Exception atau NPE baharu dalam Java 17. Ini adalah salah satu situasi sedemikian yang anda harus sentiasa cuba cegah. Kadangkala Nullpointer bermakna anda perlu nyahpepijat kod anda untuk mencari pepijat kecil. Coffee break #98.  Pengecualian Nullpointer Baharu di Java 17. Apakah maksud <T>  di Jawa?  - 1NPE ialah pengecualian masa jalan yang berlaku apabila kod anda ingin menggunakan objek atau rujukan kepada objek yang mempunyai nilai nol. Ia boleh berlaku jika tiada nilai diberikan atau objek tidak mempunyai rujukan. Sebelum versi terkini OpenJDK (versi 17), pengecualian Nullpointer biasa dalam surih tindanan akan kelihatan seperti ini:
java.lang.NullPointerException: null
Sudah tentu, bukan itu sahaja yang anda perlu tahu tentang jejak tindanan. Seperti yang anda lihat, ia tidak menunjukkan di mana atau mengapa pengecualian ini berlaku. Lihat bagaimana Java 17 menangani masalah ini:
Exception in thread "main" java.lang.NullPointerException:
Cannot assign field "i" because "a" is null
at Prog.main(Prog.java:5)
Dalam contoh ini, pengecualian menunjukkan di mana dan apakah rujukan objek nol kami. Semudah itu!

Apakah maksud <T> dalam Java?

Sumber: Dev.to <T> ialah huruf biasa yang bermaksud "Jenis" dan ia merujuk kepada konsep Generik di Jawa. Anda boleh menggunakan huruf lain untuk ini, tetapi seperti yang anda lihat, huruf T adalah lebih baik. Coffee break #98.  Pengecualian Nullpointer Baharu di Java 17. Apakah maksud <T>  di Jawa?  - 2

Apakah Generik?

Generik ialah cara untuk meparameterkan kelas, kaedah atau antara muka. Mari kita lihat contoh generik:
package Generics;

class House<T>{

    T doorNumber;

    public House(T doorNumber) {
        this.doorNumber = doorNumber;
    }

    public void print(){
        System.out.println("Your house number is: " + this.doorNumber);
    }
}
  • Kami mempunyai kelas yang dipanggil House yang boleh menerima jenis objek sewenang-wenangnya.
  • Seterusnya kita mempunyai medan yang dipanggil doorNumber , yang juga boleh menerima sebarang jenis objek.
  • Pada akhirnya kami mengisytiharkan pembina berparameter dan mencetak nombor pintu.
Ringkasnya, pengguna boleh memutuskan sama ada nombor ini adalah Integer, String, Float dan sebagainya. NOTA: anda hanya boleh menggunakan Objects . Jenis primitif tidak disokong kerana generik bertujuan untuk digunakan pada masa penyusunan. Apabila kita menggunakan Generik, T menggantikan apa-apa yang boleh memanjangkan kelas Object , dan primitif tidak mempunyai sifat ini. Katakan kita mahu doorNumber menjadi rentetan.
public class GenericsExample {
    public static void main(String[] args) {
        House<String> mainHouse = new House<>("14a");
        mainHouse.print();

    }
}
Hasilnya akan kelihatan seperti ini:
Nombor rumah anda ialah: 14a
Kami akan menggantikan huruf "T" dengan "String" dan masukkan nombor rumah ke dalam pembina. Kita boleh menggunakan berbilang jenis jika, sebagai contoh, kita memerlukan kelas untuk menerima lebih daripada satu objek. Kami boleh menambah huruf lain dan dengan itu berkata: kami mahu kelas menerima Generik lain.
package Generics;

class House<T, V>{

    T doorNumber;
    V streetName;

    public House(T doorNumber, V streetName) {
        this.doorNumber = doorNumber;
        this.streetName = streetName;
    }

    public void print(){
        System.out.println("You live at: " + this.doorNumber + " " + this.streetName);
    }
}

public class GenericsExample {
    public static void main(String[] args) {
        House<Integer, String> mainHouse = new House<>(14, "Tellson Avenue");
        mainHouse.print();

    }
}
Hasilnya akan menjadi seperti ini:
Anda tinggal di: 14 Tellson Avenue
Setakat ini kita telah melihat contoh penggunaan Generik di peringkat kelas. Tetapi kita juga boleh mempunyai kaedah dan antara muka biasa.

Kaedah generik

package Generics;

class House{

    public <T> void print(T doorNumber){
        System.out.println("You live at house number: " + doorNumber);
    }

}

public class GenericsExample {
    public static void main(String[] args) {
        House mainHouse = new House();
        mainHouse.<Integer>print(14);

    }
}
Kaedah ini menerima sebarang jenis objek dan mengeluarkan nombor pintu, yang akan menjadi sebarang jenis Object . Dalam kes ini, kami mahu kaedah menerima integer. Hasilnya akan menjadi:
Anda tinggal di rumah nombor: 14

Antara muka generik

Mula-mula buat antara muka.
package Generics;

interface Property<T>{
    void hasBalcony(T balcony);
}
Kemudian laksanakan antara muka.
package Generics;

public class House implements Property<String> {

    @Override
    public void hasBalcony(String balcony) {
        System.out.println("Is there a balcony in the room? " + balcony);
    }

    public static void main(String[] args) {
        House mainHouse = new House();
        mainHouse.hasBalcony("YES");
    }

}
Keputusan:
Adakah terdapat balkoni di dalam bilik? YA
Apakah kelebihan menggunakan generik?
  1. Semakan masa kompilasi yang lebih baik : Jika anda menggunakan jenis objek selain daripada yang anda tentukan, pengkompil akan memberitahu anda demikian.
  2. Kebolehgunaan semula : Anda boleh menggunakan kelas, kaedah atau antara muka beberapa kali kerana anda memutuskan jenis objek yang hendak digunakan bergantung pada perkara yang anda cuba capai.
  3. Ia bagus untuk struktur data dan algoritma : ArrayList dan HashMap hanyalah beberapa contoh di mana Generik digunakan.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION