From 03785636577182ca45d7c214eea36d8fcc65a711 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 1 Oct 2013 13:15:19 +0200 Subject: [PATCH] fix yet another AIOOBE caused by finally dfa --- .../dataFlow/ControlFlowAnalyzer.java | 1 + .../fixture/ExceptionFromFinallyNesting.java | 31 +++++++++++++++++++ .../DataFlowInspectionTest.java | 1 + 3 files changed, 33 insertions(+) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/ExceptionFromFinallyNesting.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 8ab933a3e9c6..f503b46e54ce 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -714,6 +714,7 @@ class ControlFlowAnalyzer extends JavaElementVisitor { if (cd.isFinally()) { flushVariablesInsideTry(cd); addInstruction(new GosubInstruction(cd.getJumpOffset(this))); + break; } else if (cd.getType().isAssignableFrom(exceptionClass)) { // Definite catch. flushVariablesInsideTry(cd); diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ExceptionFromFinallyNesting.java b/java/java-tests/testData/inspection/dataFlow/fixture/ExceptionFromFinallyNesting.java new file mode 100644 index 000000000000..8df4297bf6ae --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/ExceptionFromFinallyNesting.java @@ -0,0 +1,31 @@ +import java.io.InputStream; +import java.io.OutputStream; +import java.net.Socket; + +public class Foo { + private void run(int port) throws Exception { + Socket socket = new Socket("localhost", port); + + try { + InputStream inputReader = socket.getInputStream(); + try { + OutputStream outputWriter = socket.getOutputStream(); + try { + while (true) { + inputReader.read(); + } + } + finally { + outputWriter.close(); + } + } + finally { + inputReader.close(); + } + } + finally { + socket.close(); + } + } + +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java index 873a38f82699..b018e7fa41d8 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java @@ -69,6 +69,7 @@ public class DataFlowInspectionTest extends LightCodeInsightFixtureTestCase { public void testTryCatchInForNotComplex() throws Throwable { doTest(); } public void testNestedTryInWhileNotComplex() throws Throwable { doTest(); } public void testExceptionFromFinally() throws Throwable { doTest(); } + public void testExceptionFromFinallyNesting() throws Throwable { doTest(); } public void testFieldChangedBetweenSynchronizedBlocks() throws Throwable { doTest(); } public void testGeneratedEquals() throws Throwable { doTest(); }