JavaRush /Java Blog /Random-TW /喝咖啡休息#98。Java 17 中新的空指標異常。Java 中 意味著什麼?

喝咖啡休息#98。Java 17 中新的空指標異常。Java 中 意味著什麼?

在 Random-TW 群組發布

Java 17 中新的空指標異常

來源:Dev.to 每個 Java 開發人員都應該知道 Java 17 中存在新的空指標異常或 NPE。這是您應該始終盡力避免的情況。有時空指標意味著您需要偵錯程式碼才能找到小錯誤。 喝咖啡休息#98。 Java 17 中新的空指標異常。<T> 的作用是什麼? 在Java中? - 1NPE 是一種執行時間異常,當您的程式碼想要使用具有空值的物件或對物件的參考時,就會發生這種異常。如果未指派值或物件沒有引用,則可能會發生這種情況。在最新版本的 OpenJDK(版本 17)之前,堆疊追蹤中的正常空指標異常將如下所示:
java.lang.NullPointerException: null
當然,這並不是您需要了解的有關堆疊追蹤的全部資訊。正如您所看到的,它沒有表明此異常發生的位置或原因。看看Java 17是如何處理這個問題的:
Exception in thread "main" java.lang.NullPointerException:
Cannot assign field "i" because "a" is null
at Prog.main(Prog.java:5)
在此範例中,異常指示我們的空物件參考在哪裡以及是什麼。就這麼簡單!

Java中<T>是什麼意思?

來源:Dev.to <T>是一個常見的字母,代表“Type”,它指的是 Java 中的 Generic 概念。您可以使用另一個字母,但正如您所看到的,字母 T 更好。 喝咖啡休息#98。 Java 17 中新的空指標異常。<T> 的作用是什麼? 在Java中? - 2

什麼是通用型?

泛型是一種參數化類別、方法或介面的方法。讓我們來看一個泛型的例子:
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);
    }
}
  • 我們有一個名為House的類,它可以接受任意物件類型。
  • 接下來我們有一個名為DoorNumber的字段,它也可以接受任何類型的物件。
  • 最後我們聲明一個參數化建構函數並列印門號。
簡單來說,使用者可以決定這個數字是Integer、String、Float等。注意:您只能使用Objects。不支援原始類型,因為泛型旨在在編譯時使用。當我們使用泛型時,T會取代任何可以擴充Object類別的東西,而基元沒有這個屬性。假設我們希望DoorNumber是一個字串。
public class GenericsExample {
    public static void main(String[] args) {
        House<String> mainHouse = new House<>("14a");
        mainHouse.print();

    }
}
結果將如下所示:
您的門牌號碼是:14a
我們將字母“T”替換為“String”,並將門牌號碼輸入到建構函數中。例如,如果我們需要一個類別來接受多個對象,我們可以使用多種類型。我們可以再增加一個字母,從而表示:我們希望該類別接受另一個泛型。
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();

    }
}
結果會是這樣的:
您住在: 14 Tellson Avenue
到目前為止,我們已經看到了在類別層級使用 Generic 的範例。但我們也可以有通用的方法和介面。

通用方法

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

    }
}
此方法接受任何類型的物件並輸出門號,該門號可以是任何類型的Object。在本例中,我們希望該方法接受一個整數。結果將是:
您居住的門牌號碼:14

通用介面

首先創建介面。
package Generics;

interface Property<T>{
    void hasBalcony(T balcony);
}
然後實現接口。
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");
    }

}
結果:
房間裡有陽台嗎?是的
使用泛型有什麼優點?
  1. 更好的編譯時檢查:如果您使用指定類型以外的物件類型,編譯器會告訴您這一點。
  2. 可重複使用性:您可以多次使用一個類別、方法或接口,因為您可以根據要實現的目標來決定使用哪種物件類型。
  3. 它對於資料結構和演算法來說非常有用ArrayListHashMap只是使用 Generic 的幾個例子。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION