在pop方法中java.util.Stack,EmptyStackException如果Stack为空,则抛出一个.但是remove的方法java.util.Queue(其类似于pop在Stack类),而不是将抛出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以及Vector类StringBuffer等.但是一旦Java 1.1发布,就太晚了.
Stack类首先出现在那里.在Javadoc中它表示"自JDK 1以来".它定义了自己的异常类型,因为......它可以.
同时,NoSuchElementException已经存在,但Java集合框架尚不存在.因此,广泛使用该例外尚不普遍.它只是"预定义异常之一"类型.
集合框架是在Java 1.2中添加的,它无法使用它,StackEmptyException因为它的名称限制它仅用于堆栈.
此时,旧的Stack类不再被修改,因为这会破坏现有代码.几十年来,Java已经成功地向后兼容,异常不一致是这种兼容性的一个标志.
要获得正式答案,您可以查看代码.它说:
@author Jonathan Payne
如果您知道这一点非常重要,您可以直接与他联系并询问他是否记得他20年前的所作所为.也许他做到了.:)
Queues有特殊方法允许它返回null 而不是抛出异常.这在a的情况下很有用BlockingQueue,它应该阻塞直到出现值,或抛出异常.
在这种情况下的遗留类 - Stack- 是特殊的,它在它为空时抛出它自己的异常.这里没有真正的不一致,因为异常是不同的,只是集合服务于两个完全不同的目的.如果没有别的,这是由异常不同的事实明确记录的.
| 归档时间: |
|
| 查看次数: |
2851 次 |
| 最近记录: |