Java 尝试引发已检查异常时出现编译器错误

Java 尝试引发已检查异常时出现编译器错误,java,Java,使用此代码: @覆盖 public void TransactionPersistentEntityStore(字符串目录, StoreTransactionalExecutable(txn){ 最终PersistentEntityStore entityStore= getPersistentEntityStore(目录); entityStore.executeInTransaction(txn); } 它如何在lambda内部引发异常: (此代码引发编译器错误) Database=Dat

使用此代码:

@覆盖
public void TransactionPersistentEntityStore(字符串目录,
StoreTransactionalExecutable(txn){
最终PersistentEntityStore entityStore=
getPersistentEntityStore(目录);
entityStore.executeInTransaction(txn);
}
它如何在lambda内部引发异常: (此代码引发编译器错误)

Database=Database.getInstance();
database.TransactionPersistentEntityStore(application.getDir(),
txn->{
//编译器错误:
抛出新异常(“出错”);
});
StoreTransactionalExecutable.java来自java库的代码:

公共接口StoreTransactionalExecutable{
void execute(@NotNull final StoreTransaction txn);
}

我认为唯一的方法是让lambda在try/catch中抛出一些
RuntimeException
,并抛出一个检查过的异常,将此
RuntimeException
作为原因。比如:

try {
    database.transactPersistentEntityStore(application.getDir(), 
        txn -> {
            throw new RuntimeException("Something wrong");
        });
} catch (RuntimeException rte) {
    throw new SomeCheckedException(rte);
}

我认为唯一的方法是让lambda在try/catch中抛出一些
RuntimeException
,并抛出一个检查过的异常,将此
RuntimeException
作为原因。比如:

try {
    database.transactPersistentEntityStore(application.getDir(), 
        txn -> {
            throw new RuntimeException("Something wrong");
        });
} catch (RuntimeException rte) {
    throw new SomeCheckedException(rte);
}

这里的问题与lambda无关。必须捕获或声明选中的异常。您两个都没有做,因此编译器会抛出一个错误。这是已检查异常的定义。阅读@CharlieArmstrong该问题可能没有明确说明,但它显然是关于从lambda传播异常,以便从lambda外部引起异常。@quarks建议仍然是一样的。必须捕获或声明已检查的异常。不管你用不用lambda,都没办法。如果要将异常传播到堆栈中,则需要在函数接口中粘贴一个
throws
子句。看起来OP的接口来自Java库,所以这可能是不可能的。这里的问题与lambda无关。必须捕获或声明选中的异常。您两个都没有做,因此编译器会抛出一个错误。这是已检查异常的定义。阅读@CharlieArmstrong该问题可能没有明确说明,但它显然是关于从lambda传播异常,以便从lambda外部引起异常。@quarks建议仍然是一样的。必须捕获或声明已检查的异常。不管你用不用lambda,都没办法。如果要将异常传播到堆栈中,则需要在函数接口中粘贴一个
throws
子句。不过,看起来OP的接口来自Java库,所以这可能不可能。