2013-06-18 9 views

答えて

2

クラスを拡張できないようにします。警告は、(潜在的に)存在しないリソースを使用しようとする拡張クラスを防止するためのものです。

+0

これは、私たちの特定の状況で問題を解決したため、これを受け入れられた回答としてフラグを付けました。しかし、あなたのクラスを最終的なものとして設定したくない場合は、以下をお読みください。 –

3

ソナーがこのメッセージを吐き出すのは、派生クラスが別のクラスローダーによって読み込まれる可能性があるためです。テキストファイルが見つからない可能性があるからです。 は、私は、これを無視示唆したように、クラスが最終作る、またはリソースがスラッシュで始まるので、あまり意味がしていないよう代わりにgetClass()

3

ソナーからのエラーメッセージの.classリテラルを使用し、そうしたいですクラスパスのルートを参照します。 ...しかし、ソナーは、リソース文字列であるかどうか確認しない場合があります、そしてそれは、パスが相対パスであるかもしれないと仮定します

あなたはスラッシュなしで文字列を書いていた何が起こるか想像:

URL url = getClass().getResource("myWonderfulResource.txt"); 

URLは現在のパッケージのmyWonderfulResource.txtを指していました。ここで、クラスを別のパッケージに拡張したとします。 Awesomeのインスタンスは素晴らしいテキストファイルを取得しようとすると

package com.example; 
public class Wonderous {...} 

package com.example.awesome; 
public class Awesome extends Wonderous {...} 

は、それは、COM /例では、クラスパスに/素晴らしい、それを検索します。しかしWonderfulのリソースはcom/exampleにあります。 Awesomeが見つかりません。

ところで、このエラー報告にはFindBugsのから来て、そしてこの特定のバグのdocumentationは次のとおりです。

UI:クラスが拡張されている場合のgetResourceの使用法は安全でない可能性がある(UI_INHERITANCE_UNSAFE_GETRESOURCE)

これを呼び出します。このクラスが別のパッケージのクラスによって拡張されている場合、getClass()。getResource(...)は期待された以外の結果を与える可能性があります。

+0

.classリテラルを使用することについて私のアドバイスをレンダリングする良いポイントです。あなたが 'Wonderous.class'を使用していた場合には無視されます: –

+2

、Sonarはそれを受け入れるかもしれません。結局のところ、サブクラスは同じクラスと同じパッケージをクラスパスで使用します。絶対リソースパスを使用すると安全ですが、Sonarはおそらくチェックしません。私はそれをもっと明確にするために私の答えを編集します。 –

関連する問題