本文介紹了空檢查與可選的isPresent檢查的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
誰能解釋一下Optional
如何幫助我們避免NullPointerException
?
Optional<String> op = someFunc()
if(op.isPresent()) {
op.get();
}
String possibleNull = op.get();
此代碼不是也易于NullPointerException
嗎?如果是,那么為什么首選此代碼而不是
String op = someFunc()
if(op != null) {
op.get();
}
String possibleNull = op;
Optional
除了幫助我們了解函數是否實際具有返回值這一事實之外,它還有什么可能的好處
推薦答案
假設您要獲取函數返回的字符串,將其轉換為大寫,然后打印出來。如果您有:
String someFunc() { ... }
您可能會想寫:
System.out.println(someFunc().toUpperCase());
當然,如果someFunc
返回null
,則拋出NullPointerException
。相反,假設我們有這樣的情況:
Optional<String> someFunc() { ... }
然后
System.out.println(someFunc().toUpperCase());
不起作用,因為Optional
沒有toUpperCase
方法。此時–希望如此–您將面臨Optional
,這應該會讓您考慮Optional
為空的情況。這有助于避免NPE,但可能只是在一定程度上。
現在您可能專注于如何從Optional
中獲取值,而您可能忘記了空案例。啊,有一個get
方法:
System.out.println(someFunc().get().toUpperCase());
這將帶回與NPE相同的問題,只是例外是NoSuchElementException
。因此,如果您在Optional
上盲目調用get
,這實際上與在引用上調用方法而不檢查它是否為空幾乎是一樣的。
(出于這個原因,Brian Goetz認為Optional.get
是Java 8中最大的錯誤。參見他在16分鐘內對Angelika LangerJAX 2015 Fragen und Antworten zu Java 8的采訪。我不確定這是最大的,但這是一個錯誤。人們只是不希望get
引發異常。)
如果您經常檢查空引用或空選項,則
Optional<String> os = someFunc();
if (os.isPresent()) {
System.out.println(os.get().toUpperCase());
}
比舊的好不了多少
String s = someFunc();
if (s != null) {
System.out.println(s.toUpperCase());
}
真正的優勢在于它是一個庫類,具有相當豐富的API,用于以安全的方式處理空案例。通常可以通過將兩個方法調用鏈接到最初返回Optional
的方法來處理可能包含在Optional
中的值。例如,我們可以按如下方式重寫上面的示例:
someFunc().map(String::toUpperCase)
.ifPresent(System.out::println);
這篇關于空檢查與可選的isPresent檢查的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,