2

任何人都可以帮助我获得以下给定程序的预期输出。我尝试使用 SecurityManager,但在显示我的输出后它会抛出 SecurityException。有没有其他方法可以处理?

以应该打印的方式重写以下程序

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");
        }
    }
}   
4

4 回答 4

5

看看_Runtime.addShutdownHook(Thread hook)

它是如何完成的示例...

public void attachShutDownHook(){
  Runtime.getRuntime().addShutdownHook(new Thread() {
   @Override
   public void run() {
    ...
   }
  });
}
于 2012-08-23T03:46:37.753 回答
0

我认为 SecurityManager 方法是正确的……如果我们将其视为一个难题。如果你正确地实现它,你应该得到“Hi”和“Goodbye”消息。

可以通过安装自己的默认未捕获异常处理程序来摆脱堆栈跟踪。或者,您可以编写一个替代入口点类,该类调用该Program.main()方法并捕获当您的自定义安全管理器拒绝调用时引发的安全异常System.exit()


(当然,真正的解决方案是更改代码,使其System.exit()不被调用......这样就没有必要绕过调用。)

于 2012-08-23T03:57:43.210 回答
0

理论上, System.exit 是 JVM 停止的信号,并且不能再执行任何行。在处理完成后,JVM 没有机会执行任何操作。但是如果你想做一些优雅的关闭活动,你可以添加关闭钩子。但是你不应该误解这是在 System.exit 执行之后运行的。运行关闭挂钩和运行终结器(以回收内存)都是由 System.exit 调用导致的 JVM 关闭的一部分。

于 2012-08-23T05:18:41.550 回答
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,因为没有人说你不能更改入口点:))

另一个邪恶的样本,这次更有用:

没有人说你不能篡改其他类名和包

// 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”);
        }
    }
}

ETC..

于 2012-09-20T12:10:35.793 回答