การอ้างอิงเมธอด Java 8: ระบุผู้จัดหาที่มีความสามารถในการจัดหาผลลัพธ์ที่มีพารามิเตอร์


259

ฉันต้องการใช้

java.util.Optional.orElseThrow()

กับประเภทข้อยกเว้นที่ขอพารามิเตอร์คอนสตรัค บางสิ่งเช่นนี้

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

มีวิธีในการสร้างผู้จัดหาที่ส่งผ่านค่าอาร์กิวเมนต์ของฉันหรือไม่


43
ทำไมคุณไม่สามารถทำอะไรorElseThrow(() -> new MyException(someArgument))?
Christoffer Hammarström

6
โปรแกรมเมอร์ Java มืออาชีพที่มีลำธารและประสบการณ์ที่เป็นตัวเลือก…ฉันยังคงอยู่ที่นี่ในบางครั้ง และนี่คือเหตุผลที่ฉันชอบ Kotlin
Drew Stephens

คำตอบ:



22

ปรากฏว่าคุณสามารถโยนเพียง RuntimeException orElseThrowจากวิธีการ มิฉะนั้นคุณจะได้รับข้อความแสดงข้อผิดพลาดเช่น MyException cannot be converted to java.lang.RuntimeException

อัปเดต : - นี่เป็นปัญหาของ JDK รุ่นเก่ากว่า ฉันไม่เห็นปัญหานี้ในเวอร์ชันล่าสุด


1
ขอบคุณนี่มันทำให้ฉันง่วงเมื่อใช้งานOptionalในโหมด groovy กำลังพยายามthrow Exceptionปิดจาก groovy แต่มันล้มเหลวด้วยjava.lang.reflect.UndeclaredThrowableExceptionการเปลี่ยนเป็นRuntimeExceptionfixed มัน
Ted Naleid

ดีที่ได้รู้เกี่ยวกับเรื่องนั้น โชคดีที่ในกรณีของฉันฉันใช้ RuntimeExceptions แต่นี่อาจไม่ใช่ทุกกรณี
hbobenicio

ที่ไม่ถูกต้องตามเอกสารประกอบการเรียนสำหรับOptional.orElseThrowที่บอกว่าคุณสามารถโยนThrowableซึ่งหมายความว่าการใด ๆError หรือ Exception
Basil Bourque

ฉันคิดว่านี่เป็นปัญหาของ JDK 8 รุ่นเก่า
มนู

@Manu บางทีคุณอาจจะหมายถึงJDK-8047338การหารือเกี่ยวกับคำถามนี้โยน RuntimeException ภายในสตรีมกับ Optional.orElseThrow ถ้าเป็นเช่นนั้นรวมอยู่ในคำตอบของคุณ ฉันมีกาแฟไม่พอที่จะแยกแยะว่านี่เป็นจุด ๆ หรือไม่ดังนั้นฉันจะละเว้นจากการแก้ไขคำตอบของคุณเอง
Basil Bourque

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

ฉันได้รับข้อผิดพลาด "เมธอด orElseThrow (ซัพพลายเออร์ <? ขยาย X>) ในรูปแบบตัวเลือก <QueryEntities> ใช้ไม่ได้กับอาร์กิวเมนต์ (() -> {})"
BdEngineer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.