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 51e886a9d872..94c80f58042c 100644
--- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java
+++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java
@@ -759,10 +759,18 @@ class ControlFlowAnalyzer extends JavaElementVisitor {
PsiCatchSection section = sections[i];
PsiCodeBlock catchBlock = section.getCatchBlock();
PsiParameter parameter = section.getParameter();
- if (parameter != null && catchBlock != null && parameter.getType() instanceof PsiClassType &&
- (!myHonorRuntimeExceptions || !ExceptionUtil.isUncheckedException((PsiClassType)parameter.getType()))) {
- myCatchStack.push(new CatchDescriptor(parameter, catchBlock));
- catchesPushCount++;
+
+ if (parameter != null && catchBlock != null) {
+ for (PsiType type : section.getPreciseCatchTypes()) {
+ if (type instanceof PsiClassType &&
+ (!myHonorRuntimeExceptions || !ExceptionUtil.isUncheckedException((PsiClassType)type))) {
+ myCatchStack.push(new CatchDescriptor(parameter, catchBlock));
+ catchesPushCount++;
+ }
+ else {
+ throw new CantAnalyzeException();
+ }
+ }
}
else {
throw new CantAnalyzeException();
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/MultiCatch.java b/java/java-tests/testData/inspection/dataFlow/fixture/MultiCatch.java
new file mode 100644
index 000000000000..2ffc4a19728f
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/MultiCatch.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2000-2012 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.sql.SQLException;
+import java.util.Map;
+
+class Multicatch {
+ @NotNull
+ public Map test(String name) {
+ try (InputStream s = build()) {
+ return null;
+ } catch (SQLException | IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private InputStream build() throws SQLException {
+ return null;
+ }
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java
index cd6c67d36e57..77bc6b495136 100644
--- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionFixtureTest.java
@@ -17,6 +17,7 @@ package com.intellij.codeInspection;
import com.intellij.JavaTestUtil;
import com.intellij.codeInspection.dataFlow.DataFlowInspection;
+import com.intellij.pom.java.LanguageLevel;
import com.intellij.testFramework.builders.JavaModuleFixtureBuilder;
import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase;
@@ -26,7 +27,7 @@ import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase;
public class DataFlowInspectionFixtureTest extends JavaCodeInsightFixtureTestCase {
@Override
protected void tuneFixture(JavaModuleFixtureBuilder moduleBuilder) {
- moduleBuilder.setMockJdkLevel(JavaModuleFixtureBuilder.MockJdkLevel.jdk15);
+ moduleBuilder.setLanguageLevel(LanguageLevel.HIGHEST);
}
@Override
@@ -66,5 +67,6 @@ public class DataFlowInspectionFixtureTest extends JavaCodeInsightFixtureTestCas
public void testBoxing128() throws Throwable { doTest(); }
public void testFinalFieldsInitializedByAnnotatedParameters() throws Throwable { doTest(); }
+ public void testMultiCatch() throws Throwable { doTest(); }
}