【问题标题】:How to handle exception in findAny().get()如何处理 findAny().get() 中的异常
【发布时间】:2020-04-12 14:05:07
【问题描述】:

在下面的代码中,如果 queueName 更改为 TEST(或任何不在地图中的名称),则在第 .get(); 行获取异常 java.util.NoSuchElementException: No value present

代码正在为地图中的值工作。

请求关于如何有效处理此案例的建议,queueName 不在地图中。

public class Optional3 {
    public static void main(String[] args) {
        Map<String, String> headers = 
                new HashMap<String, String>();

        headers.put("JMS_REPLY_TO_QUEUE", "reply");
        headers.put("ERROR_QUEUE", "error");
        headers.put("RETRY_QUEUE", "retry");
        headers.put("OK_QUEUE", "ok");

        String queueName = "JMS_REPLY_TO_QUEUE"; //working
        //String queueName = "TEST"; //not working

        Optional<String> jmsReplToQueueNameOp = headers.entrySet()
                .stream()
                .filter(header -> header.getKey().equalsIgnoreCase(queueName))
                .map(jmsReplToQueue -> jmsReplToQueue.getValue())
                .map(Optional::ofNullable)
                .findAny()
                .get();

        String jmsReplToQueueName = jmsReplToQueueNameOp.isPresent() ? 
                                    jmsReplToQueueNameOp.get() : 
                                    "default";

        System.out.println(jmsReplToQueueName);
    }
}

【问题讨论】:

  • 只需从您的管道中删除 .map(Optional::ofNullable).get()... 您的倒数第二个语句也不需要比 String jmsReplToQueueName = jmsReplToQueueNameOp.orElse("default"); 更复杂
  • .map(Optional::ofNullable) 替换为.filter(e -&gt; e != null)。这应该可以解决它。
  • 感谢@ernest_k,解决方案有效

标签: java java-8 java-stream optional nosuchelementexception


【解决方案1】:

您可以使用getOrDefault(Object key, V defaultValue) API。它用于获取与指定键映射的值。如果没有使用提供的键映射任何值,则返回默认值,如下所示:

String jmsReplToQueueName = headers.getOrDefault("TEST", "default"); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多