2011-01-02 2 views
-1

У меня возникли проблемы с пониманием того, как сон работает. Например, в Java, если у меня есть тема и написать:резьба и сон

try{ 
    Thread.sleep(1000); 
    } 
    catch(exception e){//something} 
    finally{ someFunction();} 

как я понимаю, в этом коде threadf спит на одну секунду, а затем выполняет SomeFunction. Но почему это не работает:

try{ 
    Thread.sleep(1000); 
    someFunction(); 
    } 
    catch(exception e){//something} 

Конечно, в этом коде, процессор «спит» для seocnd и затем выполняет SomeFunction(). Но это не работает. Я хотел бы знать, почему?

+0

«Но это не так, как работает». так какая разница в поведении вы испытываете? –

ответ

3

Функциональность двух операторов точно такая же, пока исключение не выбрасывается - единственное различие между ними состоит в том, что блок finally будет выполнен, если исключение выбрано в блоке try.

+0

Блок finnaly будет выполнен не только в случае исключения. «Блок finally всегда выполняется, когда блок try завершается». Http://download.oracle.com/javase/tutorial/essential/exceptions/finally.html – aindl

1

Цитирую Javadoc:

Броски InterruptedException - если другой поток прервал текущий поток.

Когда поток не прерывается два блока кода являются qequivalent, но вы не можете знать, будет ли прерываться или нет, так, чтобы быть уверенным, что ваш код правильно в обоих случаях вы должны обрабатывать InterruptedException (для либо игнорировать или снова сон не прошло достаточно времени)

0

из Java tutorial на блоке, наконец:.

окончательно блок всегда выполняется, когда попытка блокировать выходы. Это гарантирует, что блок finally будет выполнен, даже если произойдет непредвиденное исключение.

Примечание: Если JVM завершает работу, пока выполняется код try или catch, блок finally может не выполняться. Аналогично, если поток, выполняющий код try или catch, прерывается или убивается, блок finally может не выполняться, даже если приложение в целом продолжается.

Таким образом, в идеале не должно быть разницы между поведением двух блоков кода. Но это поможет, если вы сможете поделиться более подробными сведениями о том, что другое.

0

В вашем первом примере кода someFunction() будет выполняться всегда, даже если блок try вызывает exception. В этом случае сначала будет выполнен блок exception, а затем блок finally. Если нет exception, то после выполнения блокабудет выполнен блок finally.

Во втором примере кода someFunction() не будет выполнен, если метод sleep() завершится с ошибкой. Затем выполняется блок exception, и строки кода после метода sleep() будут пропущены.