2015-08-07 5 views
2

Что не так с этим кодом?ошибка компиляции при метании исключения?

public class Mocker<T extends Exception> { 
    private void pleaseThrow(final Exception t) throws T{ 
     throw (T)t; 
    } 
    public static void main(String[] args) { 
     try{ 
      new Mocker<RuntimeException>().pleaseThrow(new SQLException()); 
     } 
     catch (final SQLException e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 
    } 
} 

Как и в pleaseThrow метод бросает SQLException еще дает ошибку компиляции.

Ошибка:

Unreachable catch block for SQLException. This exception is never thrown from the try 
statement body 
+3

Что это ошибка? Я не получил никакого исключения в приведенном выше коде –

+1

@SubodhJoshi. Вы ответили: –

+5

Рассмотрите, что компилятор считает «Mocker (). RequestThrow()' can throw. –

ответ

3

Проблема в том, что вы бросаете RuntimeException, но пытается поймать SQLException.

В вашем методе,

private void pleaseThrow(final Exception t) throws T{ 
    throw (T)t; 
} 

Вы бросаете аргумент SQLException в вашем случае T (который находится в вашем случае RuntimeException и бросать его.

Таким образом, компилятор ожидает RuntimeException к быть выброшены и не SQLException.

Надежда это ясно.

+0

Интересно, будет ли код работать, если SQLException расширит RuntimeException ... – Marwie

+0

@Marwie, даже тогда вы должны поймать RuntimeException, а не SQLException, но поскольку RuntimeException не отмечено, компилятор позволит вам. – Codebender

+0

Конечно, в противном случае было бы бессмысленно. Но может ли улов получить кастовое исключение? Это возможно для ответа на другой вопрос. Этот вопрос только заставлял меня думать об этом. – Marwie

2

вы могли бы написать это, когда ваш метод pleaseThrow фактически бросает SQLException.

В настоящее время то, что вы делаете, просто передаёт объект типа SQlExcetion в качестве параметра этого метода.

В настоящее время, что компилятор замечает это вы вызываете метод, и он не бросает любой SQLException, поэтому компилятор считает оговорку поймать как проблему и показывает эту проблему компиляции

2

Ваш pleaseThrow() не бросает SQLException. У вас есть выбор: сделать свой catch поймать общий Exception

 catch (final Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 

или сделать pleaseThrow(..) фактически бросаться SQLException

private void pleaseThrow(final Exception t) throws SQLException{ 
     throw (SQLException)t; 
    } 

или на самом деле бросить SQLException

new Mocker<SQLException>().pleaseThrow(new SQLException()); 
Смежные вопросы