mjc が出すエラーには3種類あります。
EPP か mjc plug-in が FATAL ERROR を出したら、 それは無条件に mjc のバグです。
わかりにくいエラーメッセージもバグです。
原因不明のエラーが出る時は、 mjc に -E-nocatch というオプションを 付けると、原因が特定できるエラーメッセージが出る場合があります。 試してみてください。
例:
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]; } }
対処法:
次のように 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 呼び出し ...; }});
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 は不要なので、取る。
対処法:
コンストラクタの引数として必要とされる Java class の型に、
明示的にキャストする。
対処法:
なし。 interface への差分の追加はあきらめる。
例えば protected Object clone() を、他のクラスから呼び出しても、 コンパイラを通ってしまい、実行時に ClassCastException が発生する。
対処法:
clone の場合は、次のように public で override する。
define class C { Object clone() throws CloneNotSupportedException { return original(); } }
あるクラスの宣言部にエラーがある時、 そのエラーのあるクラスを参照すると、 "MJ: Type dependency loop is detected" というエラーメッセージが出てしまう。
対処法:
クラス宣言部のエラーを修正すれば出なくなる。
例:
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 する。
対処法:
単純名ではなく、 ClassName.CONSTANT という構文で定数を参照する。
対処法:
Class.forName("C") で代用する。
例:
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 を継承関係のない独立したインターフェースにする。
Last updated:
Dec 11, 2006
|