链接java.lang.SQLException实例与Throwable#getCause

时间:2014-02-14 12:15:39

标签: java jdbc

"链"背后的语义是什么? SQLException个对象的问题与getCauseThrowable方法形成的类似(隐式)链有何不同?

由于SQLException也是Throwable,该类的实例可以有两个这样的"链:

  • 由一系列getNextException()调用定义的一个 - 最终返回null
  • getCause()调用序列定义的另一个 - 最终返回null

......在这种情况下,这两条链如何相互关联?

2 个答案:

答案 0 :(得分:1)

我想这是出于历史原因:

    自从jdbc引入Java 1.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()发现其他警告。