2 回答

TA貢獻1993條經驗 獲得超6個贊
傳遞Supplier給orElseThrow應該返回構造的異常,該異常與該方法的通用簽名相關,該方法聲明拋出供應商返回的內容。由于您的供應商沒有返回值,JDK 8javac推斷Throwable并要求調用者orElseThrow處理它。較新的編譯器可以在這種情況下方便地進行推斷RuntimeException,并且不會產生錯誤。
不過,正確的用法是
protected String sendTemplate1() {
? ? String template = getTemplate();
? ? return Optional.ofNullable(template)
? ? ? ? .orElseThrow(() -> new NullPointerException("message"));
}
但這是對Optionalanyway 的過度使用。你應該簡單地使用
protected String sendTemplate() {
? ? return Objects.requireNonNull(getTemplate(), "message");
}
見requireNonNull(T, String)
和requireNonNull(T, Supplier<String>)
。

TA貢獻1155條經驗 獲得超0個贊
改變這個
protected String sendTemplate() {
? ? String template = getTemplate();
? ? return Optional.ofNullable(template).orElseThrow(() -> {
? ? ? ? throw new NullPointerException("message");
? ? });
}
這樣:
protected String sendTemplate() {
? ? String template = getTemplate();
? ? return Optional.ofNullable(template).orElseThrow(() -> {
? ? ? ? return new NullPointerException("message"); // <--- RETURN here
? ? });
}
方法orElseThrow()需要一個供應商(即創建異常的東西)。你不能拋出異常,只是創建它。
添加回答
舉報