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
いくつかの状況では、これらの状況を一目見ただけであるか非常に明確ではありません。最初のケースでは、返しstream
でnull
スローそれの要素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");