为了搞乱目的,我在日食火星上写了这行代码:
null.toString();
我收到以下编译器错误消息:
无法在基本类型null
上调用toString()
这很奇怪,因为null
不是原始类型,也不是对象引用,如下所述:Is null an Object?
所以,为了确定,我尝试使用javac编译这样奇怪的代码行,我得到了这个结果:
NullTest.java:3:无法解除引用
null.toString(); ^
1错误
有人知道为什么Eclipse会给出这样的(IMO)误导性编译器错误消息吗?
答案 0 :(得分:5)
由于null-type是Object
的{{3}},因此可以调用Object
上的null
方法。
但是,遵循该逻辑,由于null-type是每个引用类型的子类型,因此我们应该允许在null
上调用任何类/接口的任何方法。那将是一团糟。
从语法上讲,null.toString()
首先应该是subtype作为方法调用表达式,因为null
是Primary
表达式。然后,确定要搜索方法toString
的类/接口,JLS recognized
...如果T是类或接口类型,则搜索的类或接口是T,如果T是类型变量,则是T的上限
如果T不是引用类型,则是编译时错误。
T
在这里是null类型;它不是类类型,接口类型或类型变量,因此此步骤应该失败。
但是,它是否因为 T不是引用类型而失败?
null-type是引用类型吗? JLS says
类型......分为两类:基本类型和引用类型
数字类型是....
引用类型是类类型,接口类型,[类型变量]和数组类型。 [期间!]
还有一种特殊的空类型。
根据您对文本的解析,null-type可能是也可能不是引用类型。这通常不是很重要;这只是分类的问题。但它会导致混淆,例如在这种情况下 - 失败是因为T
不是“正确的”引用类型,并且编译器错误地推断它必须是原始类型。
答案 1 :(得分:-2)
没有理由。
通常eclipse分析字节码,由于某种原因,null.toString()
是两个字节码语句,一个定义和一个调用。因为你只能在对象上调用toString
,所以eclipse假定声明必须声明一个原语。
您可以编写Bugreport,但请考虑错误消息国际化可能带来的开销。