我有一项服务,该服务从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是一个已检查的异常,您可以将它包装在一个未检查的异常中。
saved.ifPresent(
theUser ->
{
try {
kafkaProducer.produce(message);
} catch (EncryptionError encryptionError) {
throw new RuntimeException(encryptionError);
}
});
我想EncryptionError是已检查异常的子类型。因此,只需将其与RuntimeException包装在一起即可。像这样:try {
....
} catch (EncryptionError e) {
throw new RuntimeException(e.getMessage());
}