Рассмотрим следующий код.
Переназначение исключения в параметр улова
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;
import javax.security.auth.login.FailedLoginException;
public class ReassignmentICatch {
public void couldThrowAnException() throws SQLException, IOException {}
public void rethrow() throws SQLException, IOException {
try {
couldThrowAnException();
System.out.println("Did not throw");
} catch (Exception e) { //Line-1
e = new IOException(); //Line-2
throw e; //Line-3
}
}
public static void main(String[] args) {
ReassignmentICatch rc = new ReassignmentICatch();
try {
rc.rethrow();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Как я знаю catch(Exception e)
в java7 не перехватывать все исключения, как java6 вместо этого он улавливает только те исключения, которые упомянуты в объявлении метода couldThrowAnException
. Кроме того, переопределение нового исключения из параметра catch (e) не разрешено, поэтому мы получаем ошибку компиляции в Line-3
Это переназначение не разрешено также в java6. Я думал, что должно быть разрешено переназначить в java6, поэтому я изменил свойство java-компилятора в eclipse и установил уровень соответствия 1.6, чтобы убедиться, что этот код компилируется или нет.
поведение, что я не в состоянии предсказать это:
1.Eclipse дает ту же ошибку
Unhandled exception type Exception
для Java 6 7 и 8.
2.При я пытаюсь с помощью командной строки javac -target 1.6 -source 1.6 ReassignmentICatch.java
подводит
warning: [options] bootstrap class path not set in conjunction with -source 1.6 ReassignmentICatch.java:18: error: unreported exception Exception; must be caugh t or declared to be thrown
throw e; ^1 error 1 warning
и с java7 и java8 я могу скомпилировать и запустить его успешно с выходом Did not throw
.Why IDE и командной строкой не давая такого же результата.
Может кто-нибудь, пожалуйста, предложите мне то, что мне не хватает здесь.
Спасибо.
В java7 компилятор рассматривает e как конечный вид переменной (аналогично функции multicatch, введенной java7), поэтому неправильно переназначать и снова бросать e .. то, что я не получаю, это то, почему он не может быть скомпилирован в java6, потому что методы canThrowAnException и rethrow ясно упоминают в своем заявлении, что он может генерировать исключение IOException. Тогда что неправильно в переназначении и метании исключения, которое уже обработано. Также почему у меня другое поведение, когда я использую командную строку для ее компиляции? –
причина в строке 1 вашего кода e объявляется как исключение, а не исключение IOException или SQLException. Это правда, что вы добавляете в него IOException, но компилятор не имеет возможности предсказать его. –