Java 8 yöntem başvuruları: parametreli bir sonuç sağlayabilen bir Tedarikçi sağlayın


259

Kullanmak isterim

java.util.Optional.orElseThrow()

yapıcı parametresi isteyen bir İstisna türü ile. Bunun gibi bir şey:

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

Bağımsız değişken değerimi ileten bir Tedarikçi oluşturmanın bir yolu var mı?


43
Neden yapamıyorsun orElseThrow(() -> new MyException(someArgument))?
— Christoffer Hammarström

6
Çok sayıda akış ve isteğe bağlı deneyime sahip profesyonel Java programcısı… Bazen burada hala son buluyorum. İşte bu yüzden Kotlin'i tercih ediyorum.
— Drew Stephens

Yanıtlar:



22

Yöntemden yalnızca RuntimeException özel durumlarını atabileceğiniz anlaşılıyor orElseThrow. Aksi takdirde aşağıdaki gibi bir hata mesajı alırsınız MyException cannot be converted to java.lang.RuntimeException

Güncelleme : - Bu, JDK'nın eski bir sürümüyle ilgili bir sorundu. En son sürümlerde bu sorunu görmüyorum.


1
teşekkürler, bu Optionalharika kullanırken beni fırlattı . throw ExceptionHarika bir kapanıştan denemek , ancak başarısız oldu java.lang.reflect.UndeclaredThrowableException, RuntimeExceptiondüzeltildi.
— Ted Naleid

Bunu bilmek güzel. Neyse ki benim durumumda, RuntimeExceptions kullanıyorum, ancak bu her zaman böyle olmayabilir.
— hbobenicio

Yanlış sınıf belgelerine göre Optional.orElseThrowbir atabilir diyor ki Throwablebir anlamı Errorya da herhangi Exception.
— Basil Bourque

Bence bu JDK 8'in daha eski bir sürümü ile ilgili bir sorundu
— Manu

@Manu Belki de bu Soru üzerinde tartışılan JDK-8047338'den bahsediyorsunuz , Optional.orElseThrow ile Akış içinde RuntimeException'ı atmak . Öyleyse, Cevabınıza ekleyin. Bu yerinde olup olmadığını anlamak için yeterince kahve içmedim, bu yüzden Cevabınızı kendim düzenlemekten kaçınacağım.
— Basil Bourque

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

hata alıyorum "OrElseThrow (Tedarikçi <? X> genişletir>) yöntemi isteğe bağlı <QueryEntities> (() -> {}) bağımsız değişkenleri için geçerli değil"
— BdEngineer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.