Hatena::ブログ(Diary)

裏紙

 | 

2012-07-17

システムイグジらない

| 21:28

http://atnd.org/events/29918 の三日目ですがな(・∀・)


Effective Javaだか何かの本にライブラリでSystem.exitされててトサカにきたぜ的な何かを見た覚えがあります。

というアレで今回はそんなライブラリにぶち当たって、しかもライブラリのソース改善できない状況に追い込まれた場合を想定してSystem.exitを無かったことにする何かを書いてみます。

まずシステムイグジってしまうコードを用意します。

public class SystemExitter {

    public static void main(String[] args) {
        SystemExitter systemExitter = new SystemExitter();

        systemExitter.doSystemExit();

        System.out.println("(・∀・)システムイグジってない!!");

    }

    public void doSystemExit() {
        System.exit(0);
    }
}

実行すると、システムイグジってない、というメッセージが表示されないのでシステムイグジってることが分かりますね。

ここでSystem.exitのJavadocを読んでみますと、“セキュリティマネージャが存在し、その checkExit メソッドが、指定されたステータスでの終了を許可しない場合”にSecurityExceptionが投げられるかもしれない旨の記載があります。

つまりSecurityManagerのサブクラスを作成してcheckExitメソッドでSecurityExceptionを投げるようにし、システムイグジるライブラリを使用する側でキャッチしてやればおkですね。

public class SystemExitter {

    public static void main(String[] args) {
        System.setSecurityManager(new SM());
        try {

            SystemExitter systemExitter = new SystemExitter();

            systemExitter.doSystemExit();

        } catch (ExitSaseneeeeeeee yokuyatta) {
        }

        System.out.println("(・∀・)システムイグジってない!!");

    }

    public void doSystemExit() {
        System.exit(0);
    }
}

class SM extends SecurityManager {

    @Override
    public void checkExit(int status) {
        throw new ExitSaseneeeeeeee();
    }
}

class ExitSaseneeeeeeee extends SecurityException {
}

ガチのSecurityExceptionを見逃してもアレなのでサブクラスを作りました。

これで実行すると、システムイグジってない、というメッセージがでましたね。わーい。


まとめ

  • 色んなアプリケーションで使用されることが前提のライブラリがSystem.exitしちゃダメ
  • もうなんかなにが変態でなにが変態でないのかよく分からんようになった
 |