我有一个服务,该服务从DB查找记录并返回可选记录,然后取决于记录是否存在,我需要将记录消息推送到kafka,这是我的代码:
public void process(final String message) throws ProcessorError {
Optional<User> saved = userService.save(message);
saved.ifPresent(theUser -> kafkaProducer.produce(message));
}
但是kafkaProducer可能抛出EncryptionError,它是ProcessorError的子类,因此IntelliJ对此不满意。正如它建议我必须将代码更改为此:
saved.ifPresent(
theUser ->
{
try {
kafkaProducer.produce(message);
} catch (EncryptionError encryptionError) {
encryptionError.printStackTrace();
}
});
但我现在不想打印stacktrace,相反,我只想重新抛出它,所以我再次将其更改为:
saved.ifPresent(
theUser ->
{
try {
kafkaProducer.produce(message);
} catch (EncryptionError encryptionError) {
throw encryptionError;
}
});
但是IntelliJ仍然不满意,建议我用另一个try / catch包围该throw语句,如何在不烦恼编译器的情况下直接抛出它?
感谢每个人的答复,但我确实需要将其保持为EncryptionError而不是RuntimeException,并且我不希望用另一次try / catch来引发throw encryptionError,我会回到旧方法吗:
if (saved.isPresent()) {
kafkaProducer.produce(message);
}
最佳答案
假设EncryptionError是一个已检查的异常,则可以将它包装在一个未检查的异常中。
saved.ifPresent(
theUser ->
{
try {
kafkaProducer.produce(message);
} catch (EncryptionError encryptionError) {
throw new RuntimeException(encryptionError);
}
});