为什么Java没有EmptyQueueException?

Hai*_*ang 26 java

pop方法中java.util.Stack,EmptyStackException如果Stack为空,则抛出一个.但是remove的方法java.util.Queue(其类似于popStack类),而不是将抛出NoSuchElementException.为什么Java中存在这种不一致?

Ste*_*n C 35

Stack班是从Java 1.0中几天遗留类,之前推出的集合框架的.它的界面必须向后兼容......这就是它的设计方式.

相比之下,该Queue接口是在集合框架的Java 1.5修订版中引入的.到那个时候,NoSuchElementException设计师已经选择了表达这种错误条件的最佳方式1.

请注意,NoSuchElementException 可能已经被用于Stack因为这两个班在Java 1.0中存在的,但很明显,设计者有其他的想法当时2.

因此,这只是由于Java API的发展方式而产生的历史异常现象.如果不破坏使用Stack该类的现有应用程序的二进制兼容性,则无法修复它.


1 - 您可能不同意这一点,但您问为什么,这就是原因.

2 - 或许他们太急于让API设计正确.Java 1.0版本是在极大压力下完成的,以满足市场机会.犯了一些错误,无法及时纠正.其他示例包括EnumerationAPI,不推荐使用的Thread方法,Hashtable以及VectorStringBuffer等.但是一旦Java 1.1发布,就太晚了.

  • @GiacomoAlzetta,正如你所说,这将是一个突破性的变化.Java倾向于避免它们.不同的语言,不同的政治...... (2认同)

Rol*_*lig 9

Stack类首先出现在那里.在Javadoc中它表示"自JDK 1以来".它定义了自己的异常类型,因为......它可以.

同时,NoSuchElementException已经存在,但Java集合框架尚不存在.因此,广泛使用该例外尚不普遍.它只是"预定义异常之一"类型.

集合框架是在Java 1.2中添加的,它无法使用它,StackEmptyException因为它的名称限制它仅用于堆栈.

此时,旧的Stack类不再被修改,因为这会破坏现有代码.几十年来,Java已经成功地向后兼容,异常不一致是这种兼容性的一个标志.


要获得正式答案,您可以查看代码.它说:

@author Jonathan Payne

如果您知道这一点非常重要,您可以直接与他联系并询问他是否记得他20年前的所作所为.也许他做到了.:)

  • 没错,但是Stack的父级Vector在1.0中存在并使用NoSuchElementException.与枚举(和它的孩子)相同.因此,多个(公认的非集合框架)类已经在使用NoSuchElementException (3认同)

Mak*_*oto 6

Queues有特殊方法允许它返回null 而不是抛出异常.这在a的情况下很有用BlockingQueue,它应该阻塞直到出现值,或抛出异常.

在这种情况下的遗留类 - Stack- 是特殊的,它在它为空时抛出它自己的异常.这里没有真正的不一致,因为异常是不同的,只是集合服务于两个完全不同的目的.如果没有别的,这是由异常不同的事实明确记录的.

  • 值得注意的是,许多其他集合和集合类型使用NoSuchElementException来表示它们是空的 - 从枚举到堆栈自己的超类Vector的所有内容. (4认同)