知られているバグ

エラーメッセージについて

mjc が出すエラーには3種類あります。

EPP か mjc plug-in が FATAL ERROR を出したら、 それは無条件に mjc のバグです。

わかりにくいエラーメッセージもバグです。

原因不明のエラーが出る時は、 mjc に -E-nocatch というオプションを 付けると、原因が特定できるエラーメッセージが出る場合があります。 試してみてください。

知られているバグと対処法

field の初期値に field の値を使うとエラーになる。

例:

module m {
 define class C {
  int x = 0;
  int y = x;  // error
 }
}

対処法:
FQN を使う。

module m {
 define class C {
  int x = 0;
  int y = FQN[m::x];
 }
}

anonymous class の中では、 outer class の field/method にアクセスできない。

対処法:

次のように this の値を outer という final なローカル変数に代入しておき、 outer.foo か outer.foo() と書くことによって field/method にアクセスする。

      final Draw outer = this;               // outer という final 変数を宣言
      b.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
          Graphics g = outer.getGraphics();  // outer class の method 呼び出し
          ...;
        }});

"MJC: FATAL ERROR : findMethodInfo: ..." と出る。

Java のライブラリで定義されているメソッドと同じ signature の メソッドを define すると、 FATAL ERROR がでる。

例:

module m1 {
  define class A {
    define boolean equals(Object x) { return false; }
  }
}

エラーメッセージ:

Preprocessing phase. Test16.java:9: findMethodInfo: More than one MethodInfo found. java::equals m1::equals

define boolean equals(Object x) { return false; } ^ java.lang.Error: MJC: FATAL ERROR : findMethodInfo: More than one MethodInfo found. java::equals m1::equals

対処法:
Java のライブラリで定義されているメソッドを override する場合は define は不要なので、取る。

anonymous class のコンストラクタの引数に MJ class を指定するとエラーになる。

対処法:
コンストラクタの引数として必要とされる Java class の型に、 明示的にキャストする。

MJ interface にメソッドを追加すると、リンク時エラーになる。

対処法:
なし。 interface への差分の追加はあきらめる。

protected なメソッドを他のクラスから呼び出してもコンパイルエラーにならない。

例えば protected Object clone() を、他のクラスから呼び出しても、 コンパイラを通ってしまい、実行時に ClassCastException が発生する。

対処法:
clone の場合は、次のように public で override する。

define class C {
  Object clone() throws CloneNotSupportedException {
    return original();
  }
}

"MJ: Type dependency loop is detected" というエラーメッセージが出る。

あるクラスの宣言部にエラーがある時、 そのエラーのあるクラスを参照すると、 "MJ: Type dependency loop is detected" というエラーメッセージが出てしまう。

対処法:
クラス宣言部のエラーを修正すれば出なくなる。

ある種の Java interface を MJ class が implement するとコンパイルエラーになる。

例:

b.java:2: MJ: In b.B at module b : Definition-method overrides another method. : equals
  define class B implements java.security.Principal {
  ^
1 errors

対処法:
あらかじめ Java 言語側で、問題となる interface を implments する クラスを作っておき、そのクラスを MJ 側で extends する。

定数(static final field) を単純名で参照すると Compiling phase でエラーになる。

対処法:
単純名ではなく、 ClassName.CONSTANT という構文で定数を参照する。

C.class という構文を使うと FATAL ERROR になる。

対処法:
Class.forName("C") で代用する。

interface を含む多重継承で "Definition-method overrides another method" というエラーが出る。

例:

module m {
  define interface I1 {
    define public void m1();
  }
  define interface I2 extends I1 {}
  define class C1 implements I1 {}
  define class C2 extends C1 implements I2 {}
}

対処法:
I1 と I2 を1つのインターフェースに統合してしまう。 あるいは、 I1 と I2 を継承関係のない独立したインターフェースにする。


mj-logo
Last updated: Dec 11, 2006