不知道这是正确的位置要求,但我有一个Java的问题。 我有一些Java代码,Java 6中工作,但不是在Java 7中,错误的是:
java.lang.IllegalStateException: This function should be called while holding treeLock
使用的Java6的作品,但我们的一些外部用户正在运行的Java 7的我想通了,错误是由一个呼叫引起validateTree()
它在工作的Java6但在Java7,我们需要调用validate()
当我在本地测试一下它的工作原理。
这里是我的问题,我开始在一家大公司工作,他们不会让我们对代码做任何修改,直到其被非常throughly看了看(我的工作变化,将采取在2013年4月影响),但在那之前我们的用户越来越恼火。 我不是最好的Java和想知道是否有办法,我可以通过一个运行的参数有这个变化? 或者是有什么不接触的代码库,我可以做什么?
我embrassed问这个问题,因为它可能被刚刚实施修复,但任何意见或方向将是非常有益迎刃而解。
更新:我的理想寻找的东西,我能得到的支持就摆在Java运行参数,将改变所有validateTree()引用验证()。
我可以使用运行参数,以修复Java坏API调用的呢?
作为一般规则,没有。
在特定情况下,你可以看看相关的类的Java 7版本的类库的源代码,看看是否有一个向后兼容特性。
假设你无法找到一个解决方法,你是那种卡住。 我建议:
- 推荐给你的客户,他们使用Java 6,直至修复可以发出。
- 与管理层讨论他们能否破例他们的政策,让这个问题亟待解决。
如果没有这些作品,那么真正的问题是您的客户和管理层之间。 你做你一样可以做到。 交给“上级UPS”处理。
您可能会感兴趣我回答一个相关的SO问题这倒是他们为什么做出这个“破”的转变问题。 我的看法是这种变化是迫使人们解决一类的阴险,难以重现应用程序错误导致奇怪的UI行为。 这是一件好事......从长远来看。
基于这一点,你可以做一个更强的情况下为1136带外的修复。 此修复程序替换validateTree()
与调用validate()
调用实际上是所有 Java平台,而不仅仅是Java 7的一个必要的修复。
我有一些Java代码,Java 6中,但没有在Java 7中的作品,..
一个“处理方法”(我可以看到这是不得人心的)是:
使用JNLP部署Applet和使用J2SE版本属性的1.6*
。 请参阅Java Web Start的-运行时版本的详细信息。
注意它只会工作嵌入插件2 JRE(1.6的JRE子集)即使这样,客户端可能会收到警告有关“使用较早的JRE”。 如果小程序可以自由浮动使用JWS启动,它会与周围1.4.2+工作(据说)。
修复它改变applet代码能够同时与兼容的JRE,由克列奥帕特拉的第2个注释和斯蒂芬·C的答案概述
由返回的对象Component#getTreeLock()
被用作线程同步监视器。 某些方法的记录线程安全被废弃在从版本6至7的转变; 一个例子见这里 。 一般来说,验证Swing GUI的对象构造,并仅在操纵事件调度线程 。 其中列举了方法的这里可以自动对违法行为的搜索有用。
if (System.getProperty("java.version").startsWith("1.6")) {
...
} else{
...
}