簡體   English   中英

我想知道這兩個代碼是否具有相同的行為

[英]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.

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