From b0428ec9753e36615231f7d4c374a9d4065ac00e Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 7 Sep 2012 17:04:22 +0200 Subject: [PATCH] IDEA-31555 Wrong warning: method invocation may produce a NullPointerException --- .../dataFlow/ControlFlowAnalyzer.java | 2 +- .../dataFlow/fixture/VisitFinallyOnce.java | 39 +++++++++++++++++++ .../DataFlowInspectionFixtureTest.java | 1 + 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/VisitFinallyOnce.java diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 1b9fb57d2987..eeb7e795e1b8 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -685,7 +685,7 @@ class ControlFlowAnalyzer extends JavaElementVisitor { private void addGotoCatch(CatchDescriptor cd) { addInstruction(new PushInstruction(myFactory.getVarFactory().create(cd.getParameter(), false), null)); addInstruction(new SwapInstruction()); - addInstruction(new AssignInstruction(null)); + myCurrentFlow.addInstruction(new AssignInstruction(null)); addInstruction(new PopInstruction()); addInstruction(new GotoInstruction(cd.getJumpOffset())); } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/VisitFinallyOnce.java b/java/java-tests/testData/inspection/dataFlow/fixture/VisitFinallyOnce.java new file mode 100644 index 000000000000..7e70eb70add3 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/VisitFinallyOnce.java @@ -0,0 +1,39 @@ +import java.io.IOException; + +class TestIDEAWarn { + private Connection _connection; + + public void warn() throws IOException { + try { + if (_connection != null) { + try { + _connection.commit(); + } finally { + _connection.close(); + _connection = null; + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public void warn2() throws IOException { + if (_connection == null) return; + try { + try { + _connection.commit(); + } finally { + _connection.close(); + _connection = null; + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + interface Connection { + void commit() throws IOException; + void close() throws IOException; + } +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java index 47b3f560eec1..4412631e42eb 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java @@ -71,5 +71,6 @@ public class DataFlowInspectionFixtureTest extends JavaCodeInsightFixtureTestCas public void testContinueFlushesLoopVariable() throws Throwable { doTest(); } public void testEqualsNotNull() throws Throwable { doTest(); } + public void testVisitFinallyOnce() throws Throwable { doTest(); } }