[an error occurred while processing this directive] [an error occurred while processing this directive]

static mainの呪い

Javaでちょっとプログラム書いたことある人なら、
static でない 変数 this を static コンテキストから参照することはできません。
みたいな謎なエラーに突き当たることでしょう。 この原因ですが、大抵はJavaのmainメソッドがstaticであるために起こります。
まず深く考えない解決法(逃げ方)ですが、下のような"Static逃れ"をしたらいいです。
public class MyJava{
  public static void main(String Args[]){
    MyJava mj = new MyJava();
    mj.main();
  }
  
  public void main() {
    /* ここに書きたかった内容を書く*/
  }
}
これで大抵は何とかなるんですが、もうちょっと真面目に原因を考えてみます。
例えば下のようなプログラムを考えてみます。
public class MyJava{
  String str;
  class Nest {
    Nest(){/*コンストラクタ*/}
  }
  public static void main(String Args[]){
    str = "hoge";
    Nest n = new Nest();
  }
}
まず、mainの中の
str = "hoge";
ですが、strはインスタンス変数(インスタンスごとに異なる変数)なので、 static なメソッドからアクセスすることはできません。ここまでは分かると思います。
さらに、
Nest n = new Nest();
ですが、こっちもエラーになります。理由ですが、クラス内クラスは、「入れ子の親」の クラスのインスタンス変数にアクセスできるので、もしここで入れ子クラスNestの インスタンスを作れることにすると、Nestが内部でstrをいじってしまう恐れがあるからです。 だから、以下のように内部クラスをやめたら、変なstatic逃れはいらなくなります。
class Nest {
  Nest(){/*コンストラクタ*/}
}
public class MyJava{
  public static void main(String Args[]){
    String str;
    str = "hoge";
    Nest n = new Nest();
  }
}
C++ではmain()は特別な関数になっていますが、Javaはmainもあくまで「クラス内のメソッド」とすることで 一貫性を保つ一方、こういう面倒な問題も生じるわけです。
[an error occurred while processing this directive]