【java快速入門-異常處理篇】- NullPointerException(空指標異常)
由圖可知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