簡體   English   中英

在Java中檢查引用是否為null的最佳方法

[英]Best way to check if a reference is null in Java

我想知道什么是最好的方法來檢查我們是否在Java中有一個有效的引用。 我知道此語法有效,但令人難以置信。

if (myObj == null) {
  // Do something knowing we have an object
}

我來自其他一些語言,這些語言使您可以像檢查c ++一樣檢查指針。

char* prt = null;
if (ptr) {
  // We know we have a valid c-string 
}

Java中是否有任何模棱兩可或類似的語法? 使用編譯器擴展或預處理程序我可以。

繼續跟進。 在開始討論之前,我開始談論為什么我應該只使用Java語法,因為您可能會忘記=符號,請不要這么做。

if (myObj = null) 

將被編譯器/ lint捕獲。

nullptr_t Java沒有將nullptr_t的類似物或指針類型的隱式轉換為bool ,因此您必須使用有點冗長的表示法

if (myObj == null)

而在C ++中,我們可以編寫

if (myObj)

在這方面,Java不太簡潔,而且可以說更清晰。

沒有捷徑語法可用於處理Java中的null檢查,甚至沒有其他語言中可用的空合並或空傳播運算符。 也沒有用戶定義的轉換運算符,因此您將無法使用C ++慣用語,該慣用語使您無法在返回對象的表達式上編寫循環,例如while (cin >> x) { ... }

但是,Java 8中存在一個強大的替代方法,可以完全避免null檢查:將可空對象包裝在Optional<T> ,並使用其方法隱藏空檢查。

這是一個簡短的示例:

String s = "Hello";
Optional<String> os = Optional.ofNullable(s);
os.ifPresent(x -> { System.out.println(x); });

上面打印 "Hello" 如果將s設置為null ,則代碼將不打印任何內容。

Oracle有關使用Optional<T>的文章。

if(x == null) {
    doSomething();
}

...是Java中的通用習語。 Java的設計者決定不允許將非布爾型變量視為隱式“真實”值。

另一個常見的習慣用法是在三元語句中使用x == null

return x == null ? "not found" : x;

或使用標准方法在null早期引發異常:

Objects.requireNonNull(x);

更一般而言,嘗試采用一種編程樣式,在這種編程樣式中您永遠不會期望傳遞null,因此不必為這種可能性編寫代碼。

在非公共API上,由於您永遠不會傳遞null,因此您無需測試null(如果發生NullPointerException ,則傳遞null的人都可以自己負責混亂)。

在公共API中,在傳遞非null時驗證調用者是否有禮貌,但這在每種情況下都不是必不可少的。

一個合理的目標是始終期望輸入為非null,並且永遠不要返回null(因為Java 8,如有必要,請使用Optional ,或者采用Null Object Pattern )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM