2012-08-23 30 views
2

任何人都可以幫助我預計下面給出的程序的輸出。我試圖使用SecurityManager,但是在顯示我的輸出後它拋出SecurityException。還有其他的方式來處理它嗎?我們怎樣才能繞過System.exit在Java中執行,以便執行更多的代碼行?編程謎題

以這樣的方式重寫下面的程序,它應該打印

Hi 
Good Bye 

注意:你不能改變的主要方法

Class Program{ 
    public static void main(String args[]){ 
     try{ 
      System.out.println("Hi"); 
      System.exit(0); 
     } 
     finally{ 
      System.out.println("Good Bye"); 
     } 
    } 
} 

回答

5

the Runtime.addShutdownHook(Thread hook)

例在它如何完成...

public void attachShutDownHook(){ 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
    @Override 
    public void run() { 
    ... 
    } 
    }); 
} 
+0

爲什麼不只是用方法和類名解決?請簡單地掃描一下我的帖子,自從我上次用java編碼以來已經有相當長的一段時間了。也許我忘記了一些東西,但是這個難題似乎很容易被大多數普通方式打破。 – quetzalcoatl

0

我認爲SecurityManager的方法是正確的......如果我們認爲這是一個謎題。如果你正確地實施它,你應該得到「嗨」和「再見」消息。

可能能夠通過安裝您自己的默認未捕獲異常處理程序來擺脫堆棧跟蹤。或者,您可以編寫一個替代入口點類,該入口點類調用Program.main()方法,並捕獲您的自定義安全管理器拒絕調用System.exit()時引發的安全異常。


(當然,真正的解決方案是更改代碼,以便System.exit()不叫...所以,這是沒有必要破解待命。)

0

從理論上講,系統.exit是信號JVM停止並且不能再執行任何行。在進程完成後,JVM沒有機會執行任何操作。但是如果你想做一些正常的關機活動,你可以添加關機掛鉤。但是在執行System.exit之後,你不應該誤解它正在運行。運行關閉鉤子並運行終結器(以回收內存)是由System.exit調用導致的JVM關閉的一部分。

0

你的任務是這樣寫的:「重寫下面的程序應該打印/注意:你不能改變主要方法」?

Theeen:[邪惡的笑容]

public class Program { 
    public static void main(String args[]){ 
     System.out.println(「Hi」); 
     System.out.println(「Good Bye」); 
    } 
} 

class Program2 { 
    public static void main(String args[]){ 
     try{ 
      System.out.println(「Hi」); 
      System.exit(0); 
     } 
     finally{ 
      System.out.println(「Good Bye」); 
     } 
    } 
} 

只是因爲沒有人說,我不能改變的類名:)

或者,如果類名稱必須保持一致,交換類名和運行從命令行,而不是Program2.main,因爲沒有人說你,ucannot改變入口點:))

另一個邪惡的樣品,更有用的這個時候:

沒有人說你不能與其他類名和包篡改:

// import NOTHING 

package blargh; // note this! 

class System { 
    public static java.io.PrintStream out = java.lang.System.out; 

    public static void exit(int ignored) { } 
} 

class Program { 
    public static void main(String args[]){ 
     try{ 
      System.out.println(「Hi」); 
      System.exit(0); 
     } 
     finally{ 
      System.out.println(「Good Bye」); 
     } 
    } 
} 

等。

+0

請注意,我**可能會誤以爲靜態字段初始化語法與C#。如果是這樣 - 你必須使用靜態構造函數來正確初始化'out'字段! – quetzalcoatl

相關問題