【问题标题】:Handling exception in Lamda Expression处理 Lambda 表达式中的异常
【发布时间】:2018-08-06 13:41:31
【问题描述】:

以下代码的等效 lambda 表达式是什么?

List<String> List = new ArrayList<String>();
for (String var: alreadyList) {
     try {
         if (getNumber(var) == num) {
             filteredList.add(var);
         }
     } catch(NullPointerException exception) {
           throw exception;
     }
 }
  • getNumber 方法抛出 Nullpointerexception 并且上面的代码也在一个向调用者抛出相同异常的方法中。

这是通常的 lambda 表达式,但如何将 Nullpointerexception 放入其中?

List<String> List = alreadyList.stream()
            .filter(var -> getNumber(var) == num)
            .collect(Collectors.toList());

【问题讨论】:

  • 原来的代码很奇怪。如您所见,它只是重新抛出异常。换句话说,它并没有真正做任何事情。
  • NullPointerException 是一个未经检查的异常,因此您根本不需要明确地捕获/抛出它(并且可以说不应该。)所以简短的答案是您拥有的基于流的代码是已经相当于上面的代码了,上面的代码只是捕获了一些不必要的异常。

标签: java lambda exception-handling java-8 java-stream


【解决方案1】:

捕获 NPE 是不好的做法。 NPE 是一个未经检查的异常。来自docs

如果参数为 null,则该方法可能会抛出 NullPointerException,这是一个未经检查的异常。

为什么不向流中添加另一个过滤器:

List<String> List = alreadyList.stream()
        .filter(e -> e!= null)
        .filter(var -> getNumber(var) == num)
        .collect(Collectors.toList());

【讨论】:

  • 同意捕获 NPE 是不好的做法。
【解决方案2】:

捕获 NullPointerException 是一种不好的做法。您可以使用 Optional 类来避免它,并且仅在存在对象时才执行必要的操作。您可以毫无问题地从您的 getNumber() 方法中抛出其他异常

【讨论】:

    【解决方案3】:

    永远不要捕获未经检查的异常,包括NullPointerException。你这样做的方式只是重新抛出它。要么过滤掉 null 值。

    List<String> List = alreadyList.stream()
                                   .filter(Objects::nonNull)
                                   .filter(var -> getNumber(var) == num)
                                   .collect(Collectors.toList());
    

    您提供的代码:

    List<String> List = alreadyList.stream()
                                   .filter(var -> getNumber(var) == num)
                                   .collect(Collectors.toList());
    

    如果getNumber(var) 失败,将已经抛出NullPointerException。您的 try-catch 没有做任何不同的事情。

    【讨论】:

    • Objects::nonNull(c -&gt; c != null)有区别吗?
    • @GBlodgett:行为上没有。 Objects::nonNull 只是一个静态包装器,用作快捷方式和参考,这是过滤null 值的普遍接受的标准。查看它的实现since the line 264。此外,在c -&gt; c != null 中,您更容易忘记!
    猜你喜欢
    • 2017-03-16
    • 2018-01-03
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2015-08-19
    相关资源
    最近更新 更多