diff --git a/java/java-impl/src/com/intellij/codeInspection/ObviousNullCheckInspection.java b/java/java-impl/src/com/intellij/codeInspection/ObviousNullCheckInspection.java index 9db1645d768d..c6fafeb05178 100644 --- a/java/java-impl/src/com/intellij/codeInspection/ObviousNullCheckInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/ObviousNullCheckInspection.java @@ -30,10 +30,13 @@ public class ObviousNullCheckInspection extends AbstractBaseJavaLocalInspectionT return new JavaElementVisitor() { @Override public void visitMethodCallExpression(PsiMethodCallExpression call) { + PsiExpression[] args = call.getArgumentList().getExpressions(); + // Avoid method resolve if no argument is a candidate for obvious non-null warning + // (checking this is easier than resolving and calls without arguments are excluded at all) + if (!ContainerUtil.exists(args, arg -> getObviouslyNonNullExplanation(PsiUtil.skipParenthesizedExprDown(arg)) != null)) return; NullCheckParameter nullCheckParameter = NullCheckParameter.fromCall(call); if (nullCheckParameter == null) return; - if (!(call.getParent() instanceof PsiExpressionStatement || nullCheckParameter.myReturnsParameter)) return; - PsiExpression[] args = call.getArgumentList().getExpressions(); + if (!ExpressionUtils.isVoidContext(call) && !nullCheckParameter.myReturnsParameter) return; if (args.length <= nullCheckParameter.myIndex) return; PsiExpression nullArg = PsiUtil.skipParenthesizedExprDown(args[nullCheckParameter.myIndex]); String explanation = getObviouslyNonNullExplanation(nullArg); diff --git a/java/java-tests/testData/inspection/obviousNotNull/ObviousNullCheck.java b/java/java-tests/testData/inspection/obviousNotNull/ObviousNullCheck.java index 74cbcfb063dd..4ff7c77a815e 100644 --- a/java/java-tests/testData/inspection/obviousNotNull/ObviousNullCheck.java +++ b/java/java-tests/testData/inspection/obviousNotNull/ObviousNullCheck.java @@ -24,6 +24,16 @@ abstract class ObviousNullCheck { System.out.println(inferred("foo")); } + static String concat(String s, String m) { + if(s == null) throw new NullPointerException(); + return s+m; + } + + void testStrings(List list) { + list.forEach(s -> concat("Not null!", s)); + list.stream().map(s -> concat("Not null!", s)).forEach(System.out::println); + } + @Contract(value="null -> fail", pure=true) String trim(String s) { return s.trim();