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 7 だけでなく、すべてのJava プラットフォームで必要な修正です。

于 2012-10-10T14:16:41.567 に答える
3

Java 6 では動作するが Java 7 では動作しない Java コードがいくつかあります。

1 つの「回避策」 (これは人気がないことがわかります) は次のとおりです。

JNLP を使用してアプレットをデプロイし、J2SE バージョン属性を使用します1.6*。詳細については、 Java Web Start - ランタイムのバージョン管理を参照してください。

Plug-In 2 JRE (1.6 JRE のサブセット) に埋め込まれた場合にのみ機能することに注意してください。その場合でも、クライアントは「以前の JRE を使用しています」という警告を受け取る可能性があります。アプレットが JWS を使用してフリー フローティングで起動できる場合、(おそらく) 1.4.2 以降で動作します。

kleopatra の 2 番目のコメントと Stephen C の回答で概説されているように、両方の JRE と互換性があるようにアプレット コードを変更するように修正します。

于 2012-10-10T14:16:52.580 に答える
1

によって返されるオブジェクトはComponent#getTreeLock()、スレッド同期モニターとして使用されます。特定のメソッドの文書化されたスレッド セーフは、バージョン 6 から 7 への移行で廃止されました。例はここに見られます。一般に、Swing GUI オブジェクトがイベント ディスパッチ スレッドでのみ構築および操作されることを確認ますここで挙げたアプローチの 1 つは、違反の検索を自動化するのに役立つ場合があります。

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