FindFirstのでjava.lang.NullPointerExceptionが発生します

fastcodejava:

私は以下のコードを持っています。findfirstコールが投げているNullPointerException私が持っているにもかかわらず、orElseGetコールを連鎖

int numberOfRetry = 5;
String req = "abc";
String res =
    Stream.iterate(0, n -> n + 1).map(i -> {
        try {
            return req.substring(numberOfRetry - i);
        } catch (Exception e) {
            // log exception
        }
        return null;
    })
    .limit(1)
    .findFirst()
    .orElseGet(() -> "Exception");

以下のように私は、フィルタの呼び出しを置く場合は、それが正常に動作します:

int numberOfRetry = 5;
String req = "abc";
String res =
    Stream.iterate(0, n -> n + 1).map(i -> {
        try {
            return req.substring(numberOfRetry - i);
        } catch (Exception e) {
            // log exception
        }
        return null;
    })
    .limit(1)
    .filter(Objects::nonNull)
    .findFirst()
    .orElseGet(() -> "Exception");

私たちは、明示的に返すことができないと思いますnullいくつかの状況では、これらの状況を一目見ただけであるか非常に明確ではありません。最初のケースでは、返しstreamnullスローそれの要素NullPointerExceptionが罰金を動作空のストリームを戻す第二の場合に、。

また:

あなたのコードでは、明示的に戻っています null

return null

仕様に応じたその後のNPEをスローし、Optional.findFirst読み取ります。

@throws NullPointerException if the element selected is null
Optional<T> findFirst();

また、コード管理を明確にすることにも達することができなかったorElseGetとにかくassumingly上で動作する部分をOptional(空または一部の値とのいずれか)。


いくつかの提案:

  • あなたがそれらすべての最も一般的なアウトをキャッチしてきた場合は特に、例外を無視しないでください。
  • 帰国避けnull反復内から明示的に、それはあなたがして反復したい理由に矛盾しそうです。
  • より安全側のコードでは、現在、あなたはフィルタリング-にできる唯一の非nullオブジェクト使用しfilter

    Stream.iterate(0, n -> n + 1).map(i -> {
           try {
               return req.substring(numberOfRetry - i);
           } catch (Exception e) {
               err.add(e);
           }
           return null;
    })
    .filter(Objects::nonNull)
    .limit(1)
    .findFirst()
    .orElse("Exception");
    

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=177567&siteId=1