2014-04-13 3 views
5

У меня есть два фрагмента кода:Throw исключение в пункте поймать

class PreciseRethrow { 
public static void main(String[] str) { 
    try { 
     foo(); 
    } catch (NumberFormatException ife) { 
     System.out.println(ife); 
    } 
} 

static private void foo() throws NumberFormatException { 
    try { 
     int i = Integer.parseInt("ten"); 
    } catch (Exception e) { 
     throw e; 
    } 
} 
} 

и:

class PreciseRethrow { 
public static void main(String[] str) { 
    try { 
     foo(); 
    } catch (NumberFormatException ife) { 
     System.out.println(ife); 
    } 
} 

static private void foo() throws NumberFormatException { 
    try { 
     int i = Integer.parseInt("ten"); 
    } catch (Exception e) { 
     throw new Exception(); 
    } 
} 
} 

Во втором случае я получил ошибка компиляции "Необработанное исключение типа Exception", когда я бросаю новую Exception () в разделе catch. Можете ли вы объяснить мне, почему в первом случае все в порядке, но во втором я получаю ошибку компиляции? В обоих случаях я бросаю Exception, но во втором случае я создаю новый экземпляр исключения (это только в разнице между этими двумя примерами). Спасибо за помощь.

+0

Хороший вопрос +1 – spiderman

+0

@prash: Вы забыли фактически голосовать? – Keppil

+0

Да! Infact я сделал с мобильного. И запрос не завершен. 3g было очень мало. Это было сейчас. Благодарю. @Keppil – spiderman

ответ

0

В первом фрагменте кода вы повторно выбрасываете , который может возникнуть. Во втором фрагменте кода вы бросаете только общий Exception, который не является NumberFormatException, как объявил метод.

0

Вы пытаетесь выбросить исключение, однако вы заявляете, что вы будете кидать , который является подтипом Exception. Все NumberFormatException s - Exception s, однако не все Exception s - NumberFormatException, поэтому не допускается. В первом примере, однако, хотя вы ловите Exception, компилятор и IDE знают, что он будет только когда-либо быть , что безопасно.

2

Разница заключается в том, что компилятор может видеть, что единственное исключенное исключение, которое может быть воссоздано в первом примере, - это . (Вы не создаете никаких новых исключений.) Поэтому он доволен объявлением throws NumberFormatException { в заголовке.

Во втором примере, однако, вы явно бросаете проверенное исключение, которое не объявлено в заголовке, поэтому предсказуемо вы получаете ошибку компилятора.

+0

Я понял это только после чтения @fge. Разница между java6 и java7. Но хорошо – spiderman

0

Компилятор может определить в случае throw e, что это может быть только исключенное исключение типа NumberFormatException, которое уже объявлено в предложении throws.

В последнем случае вы пытаетесь выбросить проверенный Exception, который должен быть объявлен в броске или пойман.

0

Здесь Вы бросаете новый Exception() из улова блока, но вы упомянули ваш метод Foo() может бросить только NumberFormatException(), которая ниже в иерархии

static private void foo() throws NumberFormatException { 
    try { 
    int i = Integer.parseInt("ten"); 
    } catch (Exception e) { 
    throw new Exception(); 
    } 
    } 
5

Прежде всего: ваш первый пример не компилируется с Java 6 либо. Он будет, однако компилируется с Java 7 из-за новых возможностей обработки исключений.

Для получения дополнительной информации см. this link. В принципе, начиная с Java 7, компилятор может более точно анализировать исключения, сформированные в блоке try; и даже если вы поймаете суперкласс одного или нескольких брошенных исключений и переверните его «как есть» (т. е. без броска), компилятор не будет жаловаться. Java 6 и ранее, однако, будет жаловаться.

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

В целом, это означает, что с Java 7, вы можете сделать это, но не с Java 6:

public void someMethod() 
    throws MyException 
{ 
    try { 
     throw new MyException(); 
    } catch (Exception e) { // Note: Exception, not MyException 
     throw e; 
    } 
} 

Java 6 только видит, что параметр Загвоздка типа Exception; и для Java 6 это не соответствует сигнатуре метода -> ошибка компиляции.

Java 7 видит, что блок try может только кидать MyException. Таким образом, подпись метода соответствует -> нет ошибки компиляции.

Но не делайте этого;) Это довольно запутанным ...

+0

Хорошо объяснено, особенно при заключении – spiderman

0

В обоих случае время компиляции ошибки comes.Because вы попробуйте бросить проверяемое исключение имени Exception. Вы должны сделать одну из двух вещей:

использование попробуйте построить в блоке поймать ИЛИ Добавить исключение в Throws- предложение Foo()

Смежные вопросы