"链"背后的语义是什么? SQLException个对象的问题与getCause
类Throwable
方法形成的类似(隐式)链有何不同?
由于SQLException
也是Throwable
,该类的实例可以有两个这样的"链:
getNextException()
调用定义的一个 - 最终返回null getCause()
调用序列定义的另一个 - 最终返回null ......在这种情况下,这两条链如何相互关联?
答案 0 :(得分:1)
我想这是出于历史原因:
getNextException()
就在那里
getCause()
声明它“自1.4以来”因为出于兼容性原因,getNextException()
似乎存在getCause()
,{{1}}是链接例外的更新,更通用的方法。
答案 1 :(得分:1)
SQLException.setNextException(Exception)
和SQLException.getNextException()
允许从单个方法调用中报告多个不同的SQLException
。那些SQLException
不是彼此的原因。
实际发生的情况非常罕见,但是我说我使用2个参数执行一个准备好的insert语句。其中一个参数太长,另一个参数为空,而列为NOT NULL
。数据库可以(虽然我相信大多数数据库都不会)将这两个错误报告给驱动程序。但由于executeUpdate
方法只能抛出一个SQLException
,因此使用setNextException
将这些错误链接在一起。然后,这允许您找出两个错误条件
另请注意,SQLException
有一个iterator()
方法,允许您迭代每个SQLException
及其原因(即:当前SQLException
,所有当前原因SQLException
,下一个SQLException
等等。
类似于getNextWarning()
用于SQLWarning
如果发生多个警告(并发或顺序),它们被链接在一起。 SQLWarning
未被抛出,但在生成警告的对象上可用(例如Connection.getWarnings()
,Statement.getWarnings()
等)。此方法返回第一个警告,并允许您使用getNextWarning()
发现其他警告。