このクラスをjavacでコンパイルしようとすると、コンパイルエラーが発生し、Test.classが作成されません。
public class Test {
public static void main(String[] args) {
int x = 1L; // <- this cannot compile
}
}
しかし、Eclipseでこのクラスを作成すると、Test.classがターゲット/クラスに表示されることがわかります。 Java.exeを使用してコマンドラインからこのクラスを実行しようとすると、
スレッド「メイン」の例外Java.lang.Error:未解決のコンパイル問題:
タイプの不一致:longからintに変換できません
Eclipseは独自の特別なJavaコンパイラを使用して壊れた.classを作成しますか?Java.exeは.classのコンパイルの問題をどのようにして知っていますか?
これは、Javaコンパイラがクラスのコンパイルエラーを認識する方法です。
_public static void main(String[] paramArrayOfString)
{
throw new Error("Unresolved compilation problem: \n\tType mismatch: cannot convert from long to int.\n");
}
_
クラスファイルを逆コンパイルすると、コンパイラが生成した上記のクラスファイルのmain()
メソッドが表示されます。これは、Eclipseが使用する compiler (Eclipse Compiler for Java)が標準のJavaコンパイラと同じではないためです。
Eclipseは、コンパイルしないクラスを作成するオプションを持つIBMコンパイラーを使用し、エラーを
throw new Error();
私見、これは非常に悪い習慣であり、いくつかの非常に質の悪いプロジェクトがこれを使用するのを見てきました。プロジェクトは一度に数週間完全にコンパイルされませんでした。
バグのコストを最小限に抑えようとするフェイルファスト戦略とは異なり、できるだけ早くバグを発見すると、修正にかかるコストも最大になります。
この戦略が機能するのは、プロトタイプコードをすばやく作成している場合、つまり、知っているコードが本番環境で実行されない場合のみです。 (これが当てはまるかどうかを確認するのは難しい)
はい、 Eclipse は独自の特別なコンパイラを使用します。 「ecj」として知られています。スタックオーバーフローの質問からjavacとEclipseコンパイラの違いは何ですか?:
注目すべき違いの1つは、Eclipseコンパイラーを使用すると、実際には正しくコンパイルされなかったコードを実行できることです。エラーのあるコードブロックが実行されない場合、プログラムは正常に実行されます。そうしないと、コンパイルしないコードを実行しようとしたことを示す例外がスローされます。