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(); } }