週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

前回、Javaでpublic static void mainを通過せずにJavaプログラムを動かすことに成功しました。 その方法は、起動されたクラスの初期化のタイミングを利用するというものでした。

さらに、JavaにはJava.lang.Runtime.addShutdownHookなるメソッドがありまして、 これを用いることで起動時だけでなく終了時にも任意のメソッドを起動することが出来ます。

以上二つの入り口を利用して、 Exception in thread "main" java.lang.NoSuchMethodError: main の出る前後にHello worldを表示することに成功しました。

>type Hoge0.java
public class Hoge0 implements Runnable{
    public static int main=0;
    static Hoge0 h=new Hoge0();
    public Hoge0(){
        f();
        //System.exit(0);
    }
    private void f(){
        if ( main==0 ) {
            System.out.print("Hello ");
            Runtime.getRuntime().addShutdownHook(new Thread(this));
        }
        else
            System.out.println("world");
        ++main;
    }
    public void run(){f();}
}
>javac Hoge0.java

>java Hoge0
Hello Exception in thread "main" java.lang.NoSuchMethodError: main
world

>_
ここで、さらにコメントアウトしてあるexitを書き込むことで、mainを起動する前に Javaを終了状態にしてしまえば、邪魔な例外表示すら消せてしまうことが期待できます。 しかし、このコメントアウトを消すと、Helloだけ出力した状態でプログラムが応答しなくなってしまいます。

ここまでが前回の話です。


ここから今回の話です。

応答が帰ってくるまで削ってみます。 まず、終了中に文字列を表示するのをやめてみます。

>type Hoge1.java
public class Hoge1 implements Runnable{
    public static int main=0;
    static Hoge1 h=new Hoge1();
    public Hoge1(){
        f();
        System.exit(0);
    }
    private void f(){
        if ( main==0 ) {
            System.out.print("Hello ");
            Runtime.getRuntime().addShutdownHook(new Thread(this));
        }
        else
            ;//System.out.println("world");
        ++main;
    }
    public void run(){f();}
}
>javac Hoge1.java

>java Hoge1
Hello (返答なし)
これでも返答はありません。

試行錯誤していると、このようなコードで

>type Hoge2.java
public class Hoge2 implements Runnable{
    public static int main=0;
    static Hoge2 h=new Hoge2();
    public Hoge2(){
        f();
        System.exit(0);
    }
    private void f(){
        if ( main==0 ) {
            System.out.print("Hello ");
            Runtime.getRuntime().addShutdownHook(new Thread(this));
        }
        else
            System.out.println("world");
        ++main;
    }
    public void run(){
        System.out.println("world");
    }
}
>javac Hoge2.java

>java Hoge2
Hello world

>_
応答がありました。 予想に反して、標準出力への出力は可能でした。 つまり、応答が返らないことと標準出力の操作とはおそらく関係がありません。

さて、はじめのプログラムで応答が返ってこないのは何が原因だったのでしょうか。解決編はまた来週!!

スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://gusmachine.blog49.fc2.com/tb.php/110-40207daa
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。