Tham chiếu phương thức Java 8: cung cấp Nhà cung cấp có khả năng cung cấp kết quả được tham số hóa


259

Tôi muốn sử dụng

java.util.Optional.orElseThrow()

với một loại ngoại lệ yêu cầu tham số hàm tạo. Một cái gì đó như thế này:

.orElseThrow(MyException::new(someArgument)) // obviously NOT working

Có cách nào để tạo Nhà cung cấp vượt qua giá trị đối số của tôi không?


43
Tại sao bạn không thể làm gì orElseThrow(() -> new MyException(someArgument))?
Christoffer Hammarström

6
Lập trình viên Java chuyên nghiệp với nhiều luồng và kinh nghiệm tùy chọn Tôi đôi khi vẫn ở đây. Và đây là lý do tại sao tôi thích Kotlin.
Drew Stephens

Câu trả lời:



22

Dường như bạn chỉ có thể ném RuntimeException từ phương thức orElseThrow. Nếu không, bạn sẽ nhận được một thông báo lỗi như MyException cannot be converted to java.lang.RuntimeException

Cập nhật : - Đây là sự cố với phiên bản cũ hơn của JDK. Tôi không thấy vấn đề này với các phiên bản mới nhất.


1
cảm ơn, điều này đã làm tôi thất vọng khi sử dụng Optionaltrong Groovy. Cố gắng throw Exceptiontừ một đóng cửa Groovy, nhưng nó đã thất bại java.lang.reflect.UndeclaredThrowableException, thay đổi để RuntimeExceptioncố định nó.
Ted Naleid

Thật tốt khi biết về điều đó. May mắn là trong trường hợp của tôi, tôi đang sử dụng RuntimeExceptions, nhưng điều này có thể không phải luôn luôn như vậy.
hbobenermo

Không chính xác theo tài liệu lớp cho Optional.orElseThrowbiết bạn có thể ném Throwablenghĩa là một Errorhoặc bất kỳ Exception.
Basil Bourque

Tôi nghĩ rằng đây là một vấn đề với phiên bản cũ hơn của JDK 8.
Manu

@Manu Có lẽ bạn đang đề cập đến JDK-8047338 đã thảo luận về Câu hỏi này, hãy ném RuntimeException bên trong Luồng với tùy chọn.orElseThrow . Nếu vậy, bao gồm trong câu trả lời của bạn. Tôi đã không có đủ cà phê để phân biệt xem đây có phải là tại chỗ hay không, vì vậy tôi sẽ không tự mình chỉnh sửa Câu trả lời của bạn.
Basil Bourque

10
optionalUsers.orElseThrow(() -> new UsernameNotFoundException("Username not found"));

tôi đang gặp lỗi "Phương thức orElseThrow (Nhà cung cấp <? mở rộng X>) trong loại Tùy chọn <QueryEntities> không áp dụng cho các đối số (() -> {})"
BdEngineer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.