Я не сканировал JLS
, как вы задали в своем вопросе, поэтому, пожалуйста, примите этот ответ с крошкой соли. Я хотел сделать это комментарием, но он был бы слишком большим.
Иногда я нахожу забавным, как javac
довольно "умна" в некоторых случаях (как в вашем случае),но оставляет много других вещей, которые будут обработаны позже JIT
. В этом случае просто компилятор "может сказать", что будет пойман только RuntimeException
. Это очевидно, это единственное, что вы добавляете в doSomething
. Если вы слегка измените свой код на:
void run() {
try {
doSomething();
} catch (Exception ex) {
Exception ex2 = new Exception();
System.out.println("Error: " + ex);
throw ex2;
}
}
, вы увидите другое поведение, потому что теперь javac
может сказать, что есть новый Exception
, который вы выбрасываете, не связанный с этим. вы поймали.
Но все далеко от идеала, вы можете «обмануть» компилятор еще раз с помощью:
void run() {
try {
doSomething();
} catch (Exception ex) {
Exception ex2 = new Exception();
ex2 = ex;
System.out.println("Error: " + ex);
throw ex2;
}
}
IMO, поскольку ex2 = ex;
он не должен снова потерпеть неудачу, нооно делает.
На всякий случай это было скомпилировано с javac 13+33