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.