2012-08-22 53 views
0

可能重複:
Java: How could I 「intercept」 Ctrl+C in a CLI application?無法趕上中斷在java命令行程序

在Windows上我啓動Java非GUI應用程序執行任務的 然後按CNTL-C和程序只是退出,我的中斷處理代碼似乎沒有觸發,即使在主要方法中放入try/catch,也不會顯示堆棧跟蹤以表明它已被中斷。

public static void main(final String[] args) throws Exception 
{ 
    try 
    { 
     CmdLineDecoder cld = new CmdLineDecoder(); 
     cld.start(args); 
     System.exit(0); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
     throw e; 
    } 
} 

我明顯誤解了Cntl-C的影響,但是什麼?

+0

CmdLineDecoder.start是否引發了InterruptedException? – Jeffrey

+0

但是......什麼?你的意思是這樣關閉嗎? – Gray

+0

http://stackoverflow.com/questions/1216172/java-how-could-i-intercept-ctrlc-in-a-cli-application – jtoberon

回答

2

您不能在java中進行常規信號處理,但您可以處理Ctrl-c

如果您需要在關閉虛擬機時執行某些操作,請使用關閉掛接:Runtime.addShutdownHook

從文檔:

Java虛擬機響應兩種事件關閉:

程序正常退出,當最後一個非守護線程退出時或退出(等效地調用System.exit)方法,或者響應用戶中斷(例如鍵入^ C)或系統範圍事件(例如用戶註銷或系統關閉)而終止虛擬機。

我以前在Windows/OSX上用過這個。

+0

嗯,在事件發生後會發生這種情況。我想要發生的是我的CmdLineDecoders finally塊(未顯示)實際運行,因爲我的應用程序關閉 –

+0

好吧我想我可以與此合作,謝謝。 –