为什么Java在两个不同的环境中给了我两个不同的错误,即使(简单的)代码是相同的?

为什么Java在两个不同的环境中给了我两个不同的错误,即使(简单的)代码是相同的?,java,compiler-errors,Java,Compiler Errors,我有一个简单的代码: public class Main { public static void main(String[] args) { byte a = 10, b = 20, c = a+b; System.out.println(a); } } 这当然是一个错误。但是,如果我使用JDoodle这样的在线编辑器编译代码,我会得到以下输入,这就是我所期望的: error: incompatible types: possibl

我有一个简单的代码:

public class Main { public static void main(String[] args) { byte a = 10, b = 20, c = a+b; System.out.println(a); } } 这当然是一个错误。但是,如果我使用JDoodle这样的在线编辑器编译代码,我会得到以下输入,这就是我所期望的:

error: incompatible types: possible lossy conversion from int to byte byte a = 10, b = 20, c = a+b; ^ 1 error 否则,如果我使用Eclipse 2018-12+JDK编译代码:

java version "1.8.0_231" Java(TM) SE Runtime Environment (build 1.8.0_231-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode) 我得到了这个不同的错误:

Unresolved compilation problem: Type mismatch: cannot convert from int to byte
怎么可能呢?我认为第一个错误是正确的预期行为。我是否应该认为我的jdk有问题?

Java语言规范没有规定任何特定的错误消息。本规范只是简单地说明了所有的示例,但在整个规范中都可以找到类似的示例:

如果final作为局部变量声明的修饰符多次出现,则是编译时错误

如果T是null类型,则是编译时错误

如果已标记语句的标签名称在标签范围内用作另一个已标记语句的标签,则这是编译时错误

生成编译器错误的特定规则位于:

如果右侧操作数的类型与变量§5.2的类型赋值不兼容,则会发生编译时错误


编译器实现者可以自由地放置他们认为有用的任何消息。算你走运吧,他们不只是说:哼

如果它们是不同版本的编译器,则很容易产生不同的错误消息。不知道为什么你会认为这是个问题。他们都同意这是一个错误。无法从int转换为byte,并且从int转换为byte可能存在的有损转换是同一个错误。您甚至可以将它们组合起来,因为它们无法从int转换为byte[因为这会导致]可能的有损转换[从int转换为byte]。第一条错误消息只是说明了问题,而第二条错误消息包含了问题原因。-同样,不兼容类型和类型不匹配是相同的,只是措辞不同。这是相同的问题,来自不同编译器的错误消息不同。感谢您的回复。我的问题来自认证部分。我知道在进行认证时必须非常精确,所以我认为更改编译器不会导致Java错误的不同。那么类型不匹配和有损转换是一样的吗?可能是,但类型不匹配对我来说更像是错误的类型分配,比如字符串到int,或者布尔值到字符串,不同范围的类型不兼容。然而,我不明白为什么我会得到反对票。我的问题是关于Java的,它可能会对开发人员有所帮助,通常是一个提示/建议。为什么要对其进行向下表决..?类型不匹配与有损转换相同有损转换是由类型不匹配导致的;类型不匹配不一定是有损转换。如果您担心知道认证考试的错误消息,我认为可以肯定地说JDoodle不是规范的。Erk!