[英]I wonder if the two codes have the same behavior
如果值不存在,這兩種代碼都有拋出異常的行為。
Optional<FreePosts> byId = Optional.ofNullable(freePostsRepository.findById(id))
.orElseThrow(NoSuchElementException::new);
FreePosts byId = freePostsRepository.findById(id)
.orElseThrow(NoSuchElementException::new);
我想知道這兩個代碼之間的區別。
如果值不存在,這兩種代碼都有拋出異常的行為。
事實上,事實並非如此。 他們都不會那樣做。
這兩個版本之一是不正確的,但它是哪個版本取決於findById
聲明的返回類型。
如果返回類型是FreePosts
,那么第二個版本不會編譯,因此它是不正確的。
第一個版本等同於:
FreePosts byId = freePostsRepository.findById(id); if (byId == null) { throw new NoSuchElementException(); }
在我看來,在這種情況下最好寫一個顯式拋出,尤其是因為您可以包含一條消息。
如果返回類型Optional<FreePost>
那么第二個版本是正確的1 。
在這種情況下,當且僅當findById
返回null
時,第一個版本才會拋出異常。 但是如果findById
寫得正確,它永遠不會返回null
。 (相反,如果應該返回一個空的Optional<FreePosts>
實例。)所以:
如果findById
沒有導致它返回null
的錯誤,則第一個版本不會拋出NoSuchElementException
,因此ofNullable(...)
和orElseThrow(...)
毫無意義。
如果findById
中存在導致其返回null
的錯誤,則拋出NoSuchElementException
會掩蓋錯誤。
總之,第一個版本是不正確的。
1 - 我想存儲庫 API 的設計者可能已指定Optional<FreePosts> findById(...)
應該返回null
值而不是Optional
。 但那將是一個巨大的錯誤,IMO。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.