这是我的代码:
public static void main(String[] args){
TreeSet<Dog> d = new TreeSet<Dog>();
d.add(new Dog());
System.out.println(d.size());
}
class Dog{
}
如您所见,Dog
类不是Comparable
对象,我确定没有指定用于排序的Comparator
。这段代码如何在没有异常的情况下运行?它打印出1
。
我尝试向TreeSet添加另一个Dog
,并按预期抛出ClassCastException
。
编辑:我正在使用Java 6
答案 0 :(得分:5)
Java 7中添加了一项更改以解决此问题。这是一个错误。
由于
java.util.TreeMap
中的错误,以前可能会出错 插入无效的null元素和未实现Comparable
的元素 进入空TreeMap
和TreeSet
s 。只有一个无效元素可以 被插入空TreeMap
或TreeSet
s;其他元素 会导致预期的NullPointerException
或ClassCastException
。 收集时的大多数其他操作也会失败。从JDK开始 7,插入无效的null元素或未实现的元素Comparable
空TreeMap
或TreeSet
投掷aNullPointerException
。
(TreeSet
是以TreeMap
为基础数据结构实现的。)
答案 1 :(得分:2)
根据javadoc的预期行为,只有当新元素无法与集合中的当前元素进行比较时,它才会抛出ClassCastException:
ClassCastException - 如果指定的对象无法与此set
中当前的元素进行比较
修改强>
但是,这对JSE6有效,显然JSE7中TreeSet的javadoc已经过时,因为@SotiriosDelimanolis指出,这个问题已经解决了JSE7。
答案 2 :(得分:0)
非常好的技巧。你没有得到异常,因为你没有添加多个对象,因为只有那时你需要比较最终会抛出异常的对象。