1. 程式人生 > 其它 >【java快速入門-異常處理篇】- NullPointerException(空指標異常)

【java快速入門-異常處理篇】- NullPointerException(空指標異常)

技術標籤:java從入門到放棄java異常處理java

由圖可知NullPointerException是屬於RuntimeException異常中

NullPointerException即空指標異常,俗稱NPE。如果一個物件為null,呼叫其方法或訪問其欄位就會產生NullPointerException,這個異常通常是由JVM丟擲的,例如:

public class Main {
    public static void main(String[] args) {
        String s = null;
        System.out.println(s.toLowerCase());
    }
}
//指標這個概念實際上源自C語言,Java語言中並無指標。我們定義的變數實際上是引用型別,Null Pointer更確切地說是Null Reference,不過兩者區別不大。

那麼如何處理NullPointerException?

首先,必須明確,NullPointerException是一種程式碼邏輯錯誤,遇到NullPointerException遵循原則是早暴露,早修復,嚴禁使用catch來隱藏這種編碼錯誤。

其次好的程式設計習慣可以降低NullPointerException的產生,例如:

成員變數在定義時初始化:

public class Person {
    private String name = "";//將它定義成""(空字元)而不是預設的null可以很好的避免NullPointerException
}

編寫業務邏輯時,用空字串""表示未填寫比null安全得多。返回空字串""、空陣列而不是null

public String[] readLinesFromFile(String file) {
    if (getFileSize(file) == 0) {
        // 返回空陣列而不是null:
        return new String[0];//這樣可以使得呼叫方無需檢查結果是否為null
    }
    ...
}

如果呼叫方一定要根據null判斷,比如返回null表示檔案不存在,那麼考慮返回Optional<T>

public Optional<String> readFromFile(String file) {
    if (!fileExist(file)) {
        return Optional.empty();//這樣呼叫方必須通過Optional.isPresent()判斷是否有結果。
    }
    ...
}

那怎麼定位NullPointerException?

從Java 14開始,如果產生了NullPointerException,JVM可以給出詳細的資訊告訴我們null物件到底是誰。

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        System.out.println(p.address.city.toLowerCase());
    }
}

class Person {
    String[] name = new String[2];
    Address address = new Address();
}

class Address {
    String city;
    String street;
    String zipcode;//沒有進行初始化
}
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toLowerCase()" because "<local1>.address.city" is null
at Main.main(Main.java:5)
//可以在NullPointerException的詳細資訊中看到類似... because "<local1>.address.city" is null,意思是city欄位為null,這樣我們就能快速定位問題所在。

(這種增強的NullPointerException詳細資訊是Java 14新增的功能,但預設是關閉的,我們可以給JVM新增一個-XX:+ShowCodeDetailsInExceptionMessages引數啟用它:)

java -XX:+ShowCodeDetailsInExceptionMessages Main.java

我用的是IDEA操作步驟:Run->EditConfigurations-> VM options輸入-XX:+ShowCodeDetailsInExceptionMessages就OK

網上資源:eclipse操作步驟:

在eclipse裡開啟

設定路徑:window>preferences>java>Installed JREs

選中jdk14,點選edit

在default VM arguments中輸入:-XX:+ShowCodeDetailsInExceptionMessages