diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractChecker.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractChecker.java index 8fb809cc9dc6..a7e41a910892 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractChecker.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractChecker.java @@ -97,7 +97,7 @@ class ContractChecker extends DataFlowRunner { } if (instruction instanceof ReturnInstruction) { - if (((ReturnInstruction)instruction).isViaException()) { + if (((ReturnInstruction)instruction).isViaException() && myContract.returnValue != MethodContract.ValueConstraint.NOT_NULL_VALUE) { ContainerUtil.addIfNotNull(myFailures, ((ReturnInstruction)instruction).getAnchor()); } } diff --git a/java/java-tests/testData/inspection/dataFlow/contractCheck/ExceptionWhenDeclaredNotNull.java b/java/java-tests/testData/inspection/dataFlow/contractCheck/ExceptionWhenDeclaredNotNull.java new file mode 100644 index 000000000000..33d8ccf51173 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/contractCheck/ExceptionWhenDeclaredNotNull.java @@ -0,0 +1,17 @@ +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +class Foo { + + @Contract(value = "_, true -> !null") + public @Nullable String noNotAllowed(@NotNull String bar, boolean reallyNotAllowed) { + if (bar.equals("no")) { + if (reallyNotAllowed) { + throw new IllegalArgumentException("heck no"); + } + return null; + } + return bar; + } +} diff --git a/java/java-tests/testData/inspection/dataFlow/contractCheck/FailDelegation.java b/java/java-tests/testData/inspection/dataFlow/contractCheck/FailDelegation.java index 9f18a6deafdf..0accfd559c8a 100644 --- a/java/java-tests/testData/inspection/dataFlow/contractCheck/FailDelegation.java +++ b/java/java-tests/testData/inspection/dataFlow/contractCheck/FailDelegation.java @@ -5,7 +5,7 @@ import org.jetbrains.annotations.Nullable; class Foo { @Contract("!null,true->!null") String delegationToInstance(@NotNull Foo f, boolean createIfNeeded) { - return f.getString(createIfNeeded); + return f.getString(createIfNeeded); // not smart enough to check this } @Contract("true->fail") diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/ContractCheckTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/ContractCheckTest.java index 7ea453f2cfb0..370462d8cb71 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/ContractCheckTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/ContractCheckTest.java @@ -36,6 +36,7 @@ public class ContractCheckTest extends LightCodeInsightFixtureTestCase { public void testDelegationWithUnknownArgument() { doTest(); } public void testEqualsUnknownValue() { doTest(); } public void testMissingFail() { doTest(); } + public void testExceptionWhenDeclaredNotNull() { doTest(); } public void testCheckSuperContract() { doTest(); } public void testNestedCallsMayThrow() { doTest(); }