任何人都可以帮助我获得以下给定程序的预期输出。我尝试使用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");
}
}
}
答案 0 :(得分:5)
查看the Runtime.addShutdownHook(Thread hook)
关于它是如何完成的例子......
public void attachShutDownHook(){
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
...
}
});
}
答案 1 :(得分:0)
我认为SecurityManager方法是正确的...如果我们将其视为一个谜题。如果你正确实现它,你应该得到“Hi”和“Goodbye”消息。
你可能能够通过安装你自己的默认未捕获异常处理程序来摆脱堆栈跟踪。或者,您可以编写一个调用Program.main()
方法的备用入口点类,并捕获自定义安全管理器拒绝调用System.exit()
时引发的安全性异常。
(当然,真正的解决方案是更改代码,以便不调用System.exit()
...这样就不必破解呼叫。)
答案 2 :(得分:0)
理论上,System.exit是要停止的信号JVM,并且不能再执行任何行。 JVM在进程完成后没有机会执行任何操作。但是如果你想做一些优雅的关机活动,你可以添加关机钩子。但是,在执行System.exit之后,您不应该误解这是在运行。运行关闭挂钩和运行终结器(以回收内存)是System.exit调用导致的JVM关闭的全部内容。
答案 3 :(得分: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”);
}
}
}
等。