2013-03-05 3 views
2

Я отвечал на волну основных вопросов практического теста Java, и правильный ответ на следующий вопрос проскользнул мимо меня, пройдя тест.Необработанное исключение Java выполняет остаток метода?

Вопрос: «Если исключение не поймано, блок finally будет запущен, а остальная часть метода будет пропущена - ИСТИНА или ЛОЖЬ?»

Я пытаюсь доказать ответ с классом ThrowTest (вставленный снизу), но я считаю, что обработка исключений Java несколько незнакома. Я компилирую класс, как это происходит с частью ArrayIndexOutOfBoundsException блока catch, закомментированной. Затем я выполняю класс, не передавая входной парм, создавая таким образом исключение (исключение ArrayIndexOutOfBoundsException). Я бы ожидал, что окончательный System.out.println не будет выполняться, и это действительно не так.

Я обнаружил, что если я не комментирую блок catch ArrayIndexOutOfBoundsException и перекомпилирую, класс затем поймает эту конкретную ошибку во время выполнения и выполнит «остальную часть метода» println внизу. Итак, мой код доказывает, что остальная часть «остальной части метода пропущена», или я должен проверить ее по методу, отличному от основного метода? Возможно, существует более простой способ его тестирования.

public class ThrowTest 
{ 

    public static void main(String[] args) 
    { 
    try 
     { 
      String anyString = args[0]; 
      System.out.println("Try code executes"); 
     } 

    catch(SecurityException e) //any old exception 
     { 
      System.err.println ("Error: SecurityException. "); 
      e.printStackTrace(); 
     } 

    /* begin comment 
    catch(ArrayIndexOutOfBoundsException e) 
     { 
      System.err.println("Error: Caught ArrayIndexOutOfBoundsException. "); 
      e.printStackTrace();  
     } 
    end comment */ 

    finally 
     { 
      System.out.println("finally block executes!"); 
     } 

     System.out.println("Rest of method executes!"); 
    } 

} 

ответ

0

Ваш код действительно доказывает, что все работает так, как вы описали. Когда вы обнаруживаете исключение, тогда выполняется оставшаяся часть метода. Если вы позволите методу выбросить исключение, его выполнение немедленно прекратится. В любом случае, блок finally всегда будет выполняться.

+0

Спасибо StrixVaria a nd Veger для быстрых ответов вчера! – user2127664

1

Независимо от того, что исключение выбрасывается finally блок всегда будет выполнять (за исключением каких-либо странные ситуации, как из памяти), поэтому, учитывая следующее

try { 
    // do some code 
} 
catch (SomeException e) { 
    // exception handling 
} 
finally { 
    doFinallyStuff(); 
} 

doOtherStuff(); 

doFinallyStuff всегда будет выполнять здесь. Но doOtherStuff будет выполняться только при следующих условиях:

  • Никаких исключений не выбрасывается
  • SomeException брошено и блок поймать не повторно выдать исключение по цепочке

Если другое исключения в блок try, который не обрабатывается блоком catch, doFinallyStuff будет выполняться, но doOtherStuff не будет

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