mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
precise rethrow: runtime exception special case for generic declared type only (IDEA-180035)
This commit is contained in:
+6
-1
@@ -128,7 +128,12 @@ public class PsiCatchSectionImpl extends CompositePsiElement implements PsiCatch
|
||||
// ... and T is assignable to Ej ...
|
||||
List<PsiType> types = new ArrayList<>();
|
||||
for (PsiType type : uncaughtTypes) {
|
||||
if (declaredType.isAssignableFrom(type) || type instanceof PsiClassType && ExceptionUtil.isUncheckedException((PsiClassType)type)) {
|
||||
if (declaredType.isAssignableFrom(type) ||
|
||||
// from 11.2.3 exception checking
|
||||
// It is a compile-time error if a catch clause can catch checked exception class E1 and it is not the case that the try block corresponding to the catch clause can
|
||||
// throw a checked exception class that is a subclass or superclass of E1, unless E1 is Exception or a superclass of Exception.
|
||||
// so here unchecked exception can sneak throw Exception or Throwable catch type only
|
||||
ExceptionUtil.isGeneralExceptionType(declaredType) && type instanceof PsiClassType && ExceptionUtil.isUncheckedException((PsiClassType)type)) {
|
||||
types.add(type);
|
||||
}
|
||||
}
|
||||
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
|
||||
class MyTest {
|
||||
|
||||
public void foo() {
|
||||
try {
|
||||
bar();
|
||||
}
|
||||
catch (FileNotFoundException e) {
|
||||
<error descr="Unhandled exception: java.io.FileNotFoundException">throw e;</error>
|
||||
}
|
||||
catch (IOException ignored) { }
|
||||
}
|
||||
|
||||
private void bar() throws IOException, RuntimeException { }
|
||||
}
|
||||
|
||||
+1
@@ -143,6 +143,7 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase {
|
||||
public void testPreciseRethrow() { doTest(false, false); }
|
||||
public void testPreciseRethrowNonAssignableToException() { doTest(false, false); }
|
||||
public void testPreciseRethrowOfOneExceptionInTheBlock() { doTest(false, false); }
|
||||
public void testPreciseRethrowWithRuntimeExceptionDeclared() { doTest(false, false); }
|
||||
public void testImprovedCatchAnalysis() { doTest(true, false); }
|
||||
public void testPolymorphicTypeCast() { doTest(true, false); }
|
||||
public void testTypeCastInInstanceof() { doTest(true, false); }
|
||||
|
||||
Reference in New Issue
Block a user