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