나는 다음과 같은 코드를 발견했다.
void run() {
try {
doSomething();
} catch (Exception ex) {
System.out.println("Error: " + ex);
throw ex;
}
}
void doSomething() {
throw new RuntimeException();
}
등이 보이기 때문에이 코드는 나를 놀라게 run()
-method가 던지는 능력 Exception
이 잡는다 이후, Exception
다음을 rethrows하지만 방법은 던져 선언되지 Exception
분명히 할 필요가 없습니다. 이 코드는 Java 11 이상에서 정상적으로 컴파일됩니다.
내 기대 는 -method throws Exception
에서 선언해야한다는 것입니다 run()
.
추가 정보
비슷한 방식 doSomething
으로 던지기 로 선언되면 잡히고 다시 던져도 -method IOException
에만 선언하면 됩니다 .IOException
run()
Exception
void run() throws IOException {
try {
doSomething();
} catch (Exception ex) {
System.out.println("Error: " + ex);
throw ex;
}
}
void doSomething() throws IOException {
// ... whatever code you may want ...
}
질문
Java는 일반적으로 명확성을 좋아합니다.이 동작의 이유는 무엇입니까? 항상 이렇게 했습니까? Java 언어 사양에서 run()
메소드가 throws Exception
위의 코드 스 니펫에서 선언 할 필요가없는 것은 무엇입니까? (내가 추가하면 IntelliJ Exception
는 절대 던져지지 않는다고 경고합니다 .)
-source 1.6
플래그를 사용하여 컴파일하면 예상대로 컴파일 오류가 발생합니다. 소스 호환성 7로 컴파일해도 컴파일 오류가 발생 하지 않습니다
In detail, in Java SE 7 and later, when you declare one or more exception types in a catch clause, and rethrow the exception handled by this catch block, the compiler verifies that the type of the rethrown exception meets the following conditions : 1. 1. The try block is able to throw it. 2. There are no other preceding catch blocks that can handle it. 3. It is a subtype or supertype of one of the catch clause's exception parameters.
javac
-Eclipse 컴파일러가 더 관대 한 경우를 겪었습니다.