当我尝试编译这个类用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的:未解决的问题编译:
类型不匹配:不能从长转换为int
难道Eclipse中使用它自己的特殊的Java编译器创建一个破碎的.class? java.exe的是如何知道有关的.class complilation问题?
这是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(Eclipse的Java编译器 )是不一样的标准Java编译器!
Eclipse中使用IBM编译器具有产生不编译类的选项,以替换错误
throw new Error();
恕我直言,这是非常不好的做法,我已经看到了一些非常贫穷的优质项目使用。 该项目没有完全好几个星期的时间编译。
不同于快速失败战略,尽量减少错误的成本,发现臭虫尽可能晚也最大限度地修复它们的成本。
这个策略只适用,如果你正在编写快速原型代码,即你知道代码将永远不会投入生产。 (这是很难确定,这将是这种情况)
是的, Eclipse中使用它自己的特殊的编译器; 被称为“欧洲法院”。 从堆栈溢出的问题是什么的javac和Eclipse编译器之间的区别? :
一个显着的区别是,Eclipse编译器可以运行的代码,实际上并没有正确编译。 如果代码有错误的块绝然,你的程序将运行正常。 否则,它会抛出一个异常,表明你试图运行的代码无法编译。