2015-12-24 2 views
1

Рассмотрим следующий код.
Переназначение исключения в параметр улова

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 и командной строкой не давая такого же результата.

Может кто-нибудь, пожалуйста, предложите мне то, что мне не хватает здесь.
Спасибо.

ответ

0

Хорошо, проблема, с которой вы сталкиваетесь, вызвана из-за причин, по которым вы указали в основном ... вы не можете выбросить исключение, которое вы не указали, что метод может бросить.

Теперь вы сделали e IOException, но сама переменная указывает на объект типа Exception. вместо тех 2 линии

e = new IOException(); 
throw e; 

почему не только делают

throw new IOException(); 

это даст вам результат, который вы хотите, и не даст вам ошибку вы получите прямо сейчас.

+0

В java7 компилятор рассматривает e как конечный вид переменной (аналогично функции multicatch, введенной java7), поэтому неправильно переназначать и снова бросать e .. то, что я не получаю, это то, почему он не может быть скомпилирован в java6, потому что методы canThrowAnException и rethrow ясно упоминают в своем заявлении, что он может генерировать исключение IOException. Тогда что неправильно в переназначении и метании исключения, которое уже обработано. Также почему у меня другое поведение, когда я использую командную строку для ее компиляции? –

+1

причина в строке 1 вашего кода e объявляется как исключение, а не исключение IOException или SQLException. Это правда, что вы добавляете в него IOException, но компилятор не имеет возможности предсказать его. –