2013-07-02 3 views
4

try 또는 catch 블록이 인터럽트되는 동안 finally 블록이 실행되지 않는 경우는 언제입니까? 의사는 "try 또는 catch 코드를 실행하는 스레드가 중단되거나 죽으면 전체적으로 응용 프로그램이 계속 실행 되더라도 finally 블록이 실행되지 않을 수 있습니다." 누군가이 상황에 대한 모범을 보일 수 있습니까?try 또는 catch 블록이 인터럽트되는 동안 finally 블록이 실행되지 않는 경우

+0

그래서 질문은 무엇인가? – Caveman42

+0

@RAS 예, [마침내 항상 자바로 실행합니까?] (http://stackoverflow.com/questions/65035/does-finally-always-execute-in-java)에서 내가 알고 싶은 것을 찾았습니다. 그러나, 나는 그 질문과 동일하지 않다는 것을 의미합니다. 그러나 그 대답은 거기에 존재합니다. – andy

답변

8

좋은 답변은 here입니다.

System.exit() 외에 JVM이 어떤 이유로 든 (예 : try 블록의 무한 루프) 충돌하는 경우 finally 블록이 실행되지 않습니다.

한국인 실 자체로서,이 방법 stop() (또는 resume()없이 suspend())를 finally 블록이 실행되지 사용을 중단 한 경우에만. interrupt()을 호출해도 여전히 finally 블록이 실행됩니다.

그것은 또한 finally 블록의 모든 return또는 예외가 try/catch 블록을 던졌습니다 어떤 수익을 우선하기 때문에, 프로그램 동작 신속이 당신에게 무슨 일이 생기면 디버깅하는 이상한 하드가 될 수 있다는 것을 주목할 가치가있다. 반대로 예방 조치를 취할 가치가있는 것은 아닙니다 (극히 드문 경우에만 발생합니다). 그러나 실제로 발생했을 때이를 인식 할 수있는 가치가 있습니다.

+0

답장을 보내 주셔서 감사합니다.하지만 실제로 찾으려는 것은 ** 문장에서 중단 된 의미입니다. ** try 또는 catch 코드를 실행하는 스레드가 중단되거나 종료되면 finally 블록은 응용 프로그램 전체 계속됩니다. **. ** stop() ** 또는 ** suspend() **에 대한 중지를 의미합니까? 귀하의 대답과 마찬가지로 ** interrupt() ** 호출은 ** finally ** 실행을 중지하지 않습니다. – andy

+0

당신이 찾고있는 것이 [this] (http://stackoverflow.com/questions/3590000/what-does-java-lang-thread-interrupt-do)입니까? –

+0

네, 고마워요. – andy

7

finally가 실행되지 만들 수있는 유일한 합법적 인 방법은 갑자기 전에 그것을, 예를 들어, 응용 프로그램을 종료하지 try 또는 catch

1

System.exit 또는 Runtime.halt를 호출하는 것입니다

System.exit(); 

심지어 (예컨대 try 블록) finally 블록 전에 창은 finally 후에 실행된다.

1

이는 일반적인 Java 실행의 봉투 밖 (주로) 인 것을 나타냅니다.

  • 스레드가 (성공적으로)가 try 블록 또는 catch 블록 System.exit()를 호출하면

    는 JLS에서 사용 된 의미에서 "종료"하지 않을 것이다 전화. 다른 스레드가 System.exit()을 호출하면 똑같은 일이 발생합니다. 이 경우 JVM 만 종료 훅을 실행합니다.

  • JVM (하드)이 충돌하면 모든 Java 활동이 즉시 중단됩니다.

  • OS (하드)가 JVM 프로세스를 종료하면 모든 Java 활동이 즉시 중단됩니다.

  • 는 CPU 칩의 전원이 꺼지면

    ...

관련 문제