3

我的 Java 应用程序正在与 Apache Derby 10.8.1.2 DB 通信。我捕获了 SQL 异常并想测试一个特定的情况:LANG_DUPLICATE_KEY_CONSTRAINT 我找不到正确的 .jar 来导入org.apache.derby.shared.common.reference据说包含这个常量的文件。

甚至 Derby Developer's Guide 也建议进行如下测试:

if ( SQLState.equals( "23505" ) ) 

问题是,为什么要测试静态字符串而不是常量?我希望是这样的:

if ( SQLState.equals( SQLState.LANG_DUPLICATE_KEY_CONSTRAINT ) ) 
4

1 回答 1

2

你可能不喜欢这个答案......但这里是:

SqlState 故意不包含在任何 jar 文件中,以尽量减少 Derby 的大小。引用包描述:

包 org.apache.derby.shared.common.reference 描述

Java 编译器将内联的有用常量。包含原始或字符串常量的引用接口的集合。这些常量将由 Java 编译器内联,希望比对字段的引用所需要的占用空间更小。接口中的字段自动是公共的、静态的和最终的,因此是常量。

这些类不需要随任何 Derby jar 文件一起提供。如果附带一个 Jar 文件,那么它很可能意味着表示常量的字段是非字符串对象(例如 new Integer(1)),或者最终字段是一个计算值,无法由Java 编译器。

于 2013-06-28T04:05:47.290 回答