JavaRush /Blog Java /Random-VI /Nghỉ giải lao #98. Ngoại lệ Nullpointer mới trong Java 17...

Nghỉ giải lao #98. Ngoại lệ Nullpointer mới trong Java 17. có nghĩa là gì trong Java?

Xuất bản trong nhóm

Ngoại lệ Nullpointer mới trong Java 17

Nguồn: Dev.to Mọi nhà phát triển Java nên biết về sự tồn tại của Ngoại lệ Nullpointer hoặc NPE mới trong Java 17. Đây là một trong những tình huống mà bạn nên luôn cố gắng ngăn chặn. Đôi khi Nullpointer có nghĩa là bạn cần gỡ lỗi mã của mình để tìm ra một lỗi nhỏ. Nghỉ giải lao #98.  Ngoại lệ Nullpointer mới trong Java 17. <T>  trong Java?  - 1NPE là một ngoại lệ thời gian chạy xảy ra khi mã của bạn muốn sử dụng một đối tượng hoặc một tham chiếu đến một đối tượng có giá trị null. Nó có thể xảy ra nếu không có giá trị nào được gán hoặc đối tượng không có tham chiếu. Trước phiên bản mới nhất của OpenJDK (phiên bản 17), một ngoại lệ Nullpointer bình thường trong dấu vết ngăn xếp sẽ trông giống như thế này:
java.lang.NullPointerException: null
Tất nhiên, đó không phải là tất cả những gì bạn cần biết về dấu vết ngăn xếp. Như bạn có thể thấy, nó không cho biết địa điểm và lý do ngoại lệ này xảy ra. Xem cách Java 17 giải quyết vấn đề này:
Exception in thread "main" java.lang.NullPointerException:
Cannot assign field "i" because "a" is null
at Prog.main(Prog.java:5)
Trong ví dụ này, ngoại lệ cho biết tham chiếu đối tượng null của chúng ta ở đâu và như thế nào. Nó đơn giản mà!

<T> có nghĩa là gì trong Java?

Nguồn: Dev.to <T> là một chữ cái phổ biến viết tắt của “Type” và nó đề cập đến khái niệm Generic trong Java. Bạn có thể sử dụng một chữ cái khác cho việc này, nhưng như bạn thấy, chữ T thích hợp hơn. Nghỉ giải lao #98.  Ngoại lệ Nullpointer mới trong Java 17. <T>  trong Java?  - 2

Chung là gì?

Generic là một cách để tham số hóa một lớp, phương thức hoặc giao diện. Hãy xem một ví dụ về một cái chung:
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);
    }
}
  • Chúng ta có một lớp tên là House có thể chấp nhận một loại đối tượng tùy ý.
  • Tiếp theo, chúng ta có một trường có tên là DoorNumber , trường này cũng có thể chấp nhận bất kỳ loại đối tượng nào.
  • Cuối cùng, chúng ta khai báo một hàm tạo được tham số hóa và in số cửa.
Nói một cách đơn giản, người dùng có thể quyết định xem số này có phải là Số nguyên, Chuỗi, Số float, v.v. LƯU Ý: bạn chỉ có thể sử dụng Objects . Các kiểu nguyên thủy không được hỗ trợ vì các kiểu generic được dự định sẽ được sử dụng tại thời điểm biên dịch. Khi chúng ta sử dụng Generics, T sẽ thay thế bất cứ thứ gì có thể mở rộng lớp Object và các lớp nguyên thủy không có thuộc tính này. Giả sử chúng ta muốn số cửa là một chuỗi.
public class GenericsExample {
    public static void main(String[] args) {
        House<String> mainHouse = new House<>("14a");
        mainHouse.print();

    }
}
Kết quả sẽ như thế này:
Số nhà của bạn là: 14a
Chúng ta sẽ thay chữ “T” bằng “String” và nhập số nhà vào hàm tạo. Ví dụ: chúng ta có thể sử dụng nhiều loại nếu chúng ta cần một lớp để chấp nhận nhiều hơn một đối tượng. Chúng ta có thể thêm một chữ cái khác và từ đó nói: chúng ta muốn lớp chấp nhận một Generic khác.
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();

    }
}
Kết quả sẽ như thế này:
Bạn sống ở: 14 Đại lộ Tellson
Cho đến nay chúng ta đã thấy các ví dụ về việc sử dụng Generic ở cấp độ lớp. Nhưng chúng ta cũng có thể có các phương thức và giao diện chung.

Phương pháp chung

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);

    }
}
Phương thức này chấp nhận bất kỳ loại đối tượng nào và xuất ra số cửa, sẽ là bất kỳ loại Object nào . Trong trường hợp này, chúng ta muốn phương thức chấp nhận một số nguyên. Kết quả sẽ là:
Bạn sống ở số nhà: 14

Giao diện chung

Đầu tiên tạo giao diện.
package Generics;

interface Property<T>{
    void hasBalcony(T balcony);
}
Sau đó thực hiện giao diện.
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");
    }

}
Kết quả:
Có ban công trong phòng không? ĐÚNG
Ưu điểm của việc sử dụng thuốc generic là gì?
  1. Kiểm tra thời gian biên dịch tốt hơn : Nếu bạn sử dụng một loại đối tượng khác với loại bạn đã chỉ định, trình biên dịch sẽ cho bạn biết như vậy.
  2. Khả năng sử dụng lại : Bạn có thể sử dụng một lớp, phương thức hoặc giao diện nhiều lần vì bạn quyết định loại đối tượng nào sẽ sử dụng tùy thuộc vào những gì bạn đang cố gắng đạt được.
  3. Nó rất tốt cho các cấu trúc dữ liệu và thuật toán : ArrayListHashMap chỉ là một vài ví dụ trong đó Generic được sử dụng.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION