在Lamda Expression中处理异常

时间:2018-08-06 13:41:31

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

下面的代码等效的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());

3 个答案:

答案 0 :(得分:3)

赶上NPE是不好的做法。 NPE是未经检查的异常。来自docs

  

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

为什么不将另一个过滤器添加到流中?

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

从不捕获包括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());

NullPointerException失败的情况下,将已经抛出getNumber(var)。您的try-catch没什么不同。