2015-07-24 5 views
3

У меня есть следующие:Поймать же исключение дважды

public void method(){ 

    try { 
     methodThrowingIllegalArgumentException(); 
     return; 
    } catch (IllegalArgumentException e) { 
     anotherMethodThrowingIllegalArgumentException();    
     return; 
    } catch (IllegalArgumentException eee){ //1 
     //do some 
     return; 
    } catch (SomeAnotherException ee) { 
     return; 
    } 
} 

Java не позволяет нам поймать исключение дважды, поэтому мы получили ошибку компиляции Иней на //1. Но мне нужно сделать именно то, что я пытаюсь сделать:

попробовать метод methodThrowingIllegalArgumentException() первым, и если он терпит неудачу с IAE, попробуйте anotherMethodThrowingIllegalArgumentException();, если он терпит неудачу с IAE тоже сделать некоторые и вернуться. Если он не сработает с SomeAnotherException, просто вернитесь.

Как это сделать?

ответ

6

anotherMethodThrowingIllegalArgumentException() Если вызов внутри catch блока может выбросить исключение должно быть пойманным там, а не как часть «верхнего уровня» try заявления:

public void method(){ 

    try{ 
     methodThrowingIllegalArgumentException(); 
     return; 
    catch (IllegalArgumentException e) { 
     try { 
      anotherMethodThrowingIllegalArgumentException();    
      return; 
     } catch(IllegalArgumentException eee){ 
      //do some 
      return; 
     } 
    } catch (SomeAnotherException ee){ 
     return; 
    } 
} 
+0

Действительно, thatnk вас. –

+1

@ St.Antario Это кажется кодовым запахом для меня - хотя это правильный ответ. Если вам нужно писать код таким образом, вы, вероятно, можете реорганизовать его, чтобы быть чище. Насколько я знаю, высказывания catch не должны делать ничего, что могло бы вызвать исключительную ситуацию. – crush

+0

@crush __ Насколько я знаю, я думаю, что это неправда, потому что вы хотите бросить что-то более информативное, чем, скажем, IndexOutOfBoundException. –

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