簡體   English   中英

在Java8中的可選中拋出異常

[英]Throw exception in optional in Java8

有一個方法get(sql) (我不能修改它)。 此方法返回 MyObjects 並且它必須在 try catch 塊中,因為那里可能出現JqlParseException 我的代碼是:

String sql = something;
try{
   MyObject object = get(sql);
} catch(JqlParseException e){
   e.printStackTrace();
} catch(RuntimeException e){
   e.printStackTrace();
}

我想刪除 try catch 並使用Optional類,我試過:

MyObject object = Optional.ofNullable(get(sql)).orElseThrow(RuntimeException::new);

但 IDE 也強制在那里嘗試捕捉。 對於:

MyObject object = Optional.ofNullable(get(sql)).orElseThrow(JqlParseException::new));

是錯誤(在 IDE 中) The type JqlParseException does not define JqlParseException() that is applicable 有什么辦法可以避免 try catch 塊並使用 optional 嗎?

Optional的目的不是為了處理異常,而是為了在不破壞程序流程的情況下處理潛在的null 例如:

 myOptional.map(Integer::parseInt).orElseThrow(() -> new RuntimeException("No data!");

如果可選選項為空,這將自動跳過map步驟並直接進入throw步驟——一個很好的完整程序流程。

當你寫:

 myOptionalValue.orElseThrow(() -> new RuntimeException("Unavailable"));

...您真正要說的是:返回我的可選值,但如果它不可用則拋出異常。

您似乎想要的是一種創建可選項(立即捕獲異常)並在您嘗試使用可選項時重新拋出該異常的方法。

這不是 Optional 的工作方式。 他們不會讓 try-catch-blocks 過時。 但是,您可以像這樣引入一個新的包裝函數:

public Optional<MyObject> getMyObject(final String jql) {
    try {
        return Optional.ofNullable(get(sql));
    } catch (final JqlParseException e) {
        return Optional.empty();
    }
}

您將不必再處理異常,但如果您也得到一個空的 Optional,您將不知道是否有錯誤。

嘗試這個

Optional.ofNullable(result)
                .orElseThrow(() -> new GenericClientException("Request body is not valid", HttpStatus.BAD_REQUEST));

如果(StringUtils.isEmpty(消息)){

            throw new ValidationException("empty message body received from the queue");

在 Java 8 中

Optional.ofNullable(message).filter(message -> !message.isEmpty()).orElseThrow(() -> new ValidationException("從隊列接收到空消息體")

        );
            

Optional 有助於處理 NullPointerException。

如前所述,您可以使用它來投射新的異常。

MyObject object = Optional.ofNullable(get(sql)).orElseThrow(RuntimeException::new);

但是,您的方法get(sql)沒有返回 NULL,這會根據需要使 OPTIONAL 的使用無效。

我會繼續使用 Try Catch。

暫無
暫無

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

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