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

あなたの仕事は文字通りそのように書かれていますか:「以下のプログラムを印刷するように書き直してください/注:メインメソッドを変更することはできません」?

シーーン: [邪悪な笑み]

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

等..

于 2012-09-20T12:10:35.793 に答える
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 に答える