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