抛出异常Java 8 Lambda

问题描述 投票:0回答:2

我有一项服务,该服务从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语句,如何在不烦恼编译器的情况下直接抛出它?

java lambda optional
2个回答
0
投票

假设EncryptionError是一个已检查的异常,您可以将它包装在一个未检查的异常中。

saved.ifPresent(
        theUser ->
        {
          try {
            kafkaProducer.produce(message);
          } catch (EncryptionError encryptionError) {
            throw new RuntimeException(encryptionError);
          }
        });

0
投票

我想EncryptionError是已检查异常的子类型。因此,只需将其与RuntimeException包装在一起即可。像这样:try { .... } catch (EncryptionError e) { throw new RuntimeException(e.getMessage()); }

© www.soinside.com 2019 - 2024. All rights reserved.