我有一个服务,该服务从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);
          }
        });

10-04 18:12