5

不确定这是否是正确的提问地点,但我遇到了 Java 问题。我有一些适用于 Java 6 但不适用于 Java 7 的 Java 代码,错误是:

java.lang.IllegalStateException: This function should be called while holding treeLock

使用 Java6 有效,但我们的一些外部用户正在运行 Java 7。我发现错误是由对 的调用引起的,该调用validateTree()在 java6 中有效,但在 Java7 中我们需要调用validate(). 当我在本地测试它时,它可以工作。

这是我的问题,我开始在一家大公司工作,他们不会让我们对代码进行任何更改,直到它被彻底检查(我的工作更改将在 2013 年 4 月生效)但在那之前我们的用户是生气。我对 Java 不是最好的,我想知道是否有一种方法可以传递运行时参数来改变它?或者有什么我可以在不接触代码库的情况下做的吗?

我不好意思问这个问题,因为只需实施修复程序就可以轻松解决它,但任何想法或方向都会非常有帮助。

更新:理想情况下,我正在寻找可以支持将所有 validateTree() 引用更改为 validate() 的 java 运行时参数。

4

4 回答 4

6

我可以使用运行时参数来修复 Java 中的错误 API 调用吗?

作为一般规则,没有。

在特定情况下,您可以查看相关类的源代码 Java 7 版本的类库,以查看是否存在向后兼容性属性。


假设您找不到修复程序,那么您就会陷入困境。我建议:

  • 向您的客户推荐他们使用 Java 6,直到可以发布修复程序。
  • 与您的管理层讨论他们是否可以对他们的政策做出例外处理,以便紧急解决这个问题。

如果这些都不起作用,那么真正的问题在于您的客户和您的管理层之间。你已经做了尽可能多的事情。留给“上级”处理吧。


您可能对我对相关 SO 问题的回答感兴趣,该问题涉及他们为什么做出这种“重大”改变的问题。我的看法是,这种变化是为了迫使人们修复一类导致奇怪 UI 行为的隐蔽、难以重现的应用程序错误。这是一件好事……从长远来看。

基于此,您可以为发布带外修复提供更有力的理由。用调用替换validateTree()调用的修复validate()实际上是所有Java 平台的必要修复,而不仅仅是 Java 7。

于 2012-10-10T14:16:41.567 回答
3

我有一些适用于 Java 6 但不适用于 Java 7 的 Java 代码,..

一种“解决方法”(我可以看到这不受欢迎)是:

使用 JNLP 部署小程序使用1.6*. 有关详细信息,请参阅Java Web Start - 运行时版本控制

请注意,它只能嵌入在 Plug-In 2 JRE(1.6 JRE 的子集)中,即使这样,客户端也可能会收到有关“使用较早的 JRE”的警告。如果可以使用 JWS 自由浮动启动小程序,它将(假设)在 1.4.2+ 左右工作。

修复它以更改小程序代码以与两个 JRE 兼容,正如 kleopatra 的第二条评论和 Stephen C.

于 2012-10-10T14:16:52.580 回答
1

返回的对象Component#getTreeLock()用作线程同步监视器。在从版本 6 到版本 7 的转换中,某些方法的文档化线程安全性已被弃用;这里有一个例子。通常,验证 Swing GUI 对象是否事件调度线程上构造和操作。此处引用的一种方法可能有助于自动搜索违规行为。

于 2012-10-10T18:49:53.903 回答
0
if (System.getProperty("java.version").startsWith("1.6")) {
...
} else{
...
}
于 2012-10-10T16:15:52.877 回答