2013-06-18 13 views

Antwort

2

Machen Sie die Klasse final so dass es nicht erweitert werden kann. Die Warnung soll verhindern, dass die erweiterte Klasse (möglicherweise) versucht, nicht vorhandene Ressourcen zu verwenden.

+0

Dies wurde als akzeptierte Antwort markiert, weil das das Problem in unserer speziellen Situation löste. Wenn Sie Ihre Klasse jedoch nicht als final festlegen möchten, lesen Sie weiter unten ... –

3

Das einzige, was ich mir vorstellen kann, warum Sonar diese Nachricht ausspuckt, ist, weil eine abgeleitete Klasse möglicherweise von einem anderen Klassenlader geladen wird, so dass Ihre Textdatei dann möglicherweise nicht gefunden wird. Ich würde dies einfach ignorieren, machen die Klasse final, wie vorgeschlagen, oder eine .class wörtliche getClass() statt

3

Die Fehlermeldung von Sonar nicht verwenden scheinen viel Sinn zu machen, da die Ressource mit einem Schrägstrich beginnt, und so wird im Stammverzeichnis des Klassenpfads nachgeschlagen. Allerdings Sonar möglicherweise nicht überprüfen, was in dem Ressource-String ist, und es wird dann der Pfad annehmen könnte ein relativer Pfad sein ..

Stellen Sie sich vor, was Sie eine Zeichenfolge ohne einen Schrägstrich geschrieben würde geschehen hat:

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

Die URL würde im aktuellen Paket auf myWonderfulResource.txt zeigen. Angenommen, Sie haben die Klasse in einem anderen Paket erweitert.

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

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

Wenn eine Instanz von Awesome versucht, die wunderbaren Textdatei zu erhalten, sieht es auf dem Klassenpfad in com/example nach oben/genial. Aber Wonderful 's Ressource ist in com/example. Awesome wird es nicht finden.

übrigens dieser Fehlerbericht kommt aus FindBugs und die documentation für diesen speziellen Fehler ist:

UI: Verwendung von GetResource unsicher sein kann, wenn Klasse erweitert wird (UI_INHERITANCE_UNSAFE_GETRESOURCE)

diesen Aufruf. getClass(). getResource (...) könnte andere als erwartete Ergebnisse liefern, wenn diese Klasse um eine Klasse in einem anderen Paket erweitert wird.

+0

Guter Punkt, der meinen Hinweis auf die Verwendung eines .class-Literals etwas nutzlos macht. Ignorieren funktioniert immer noch, wenn wir das führende "/" behalten :-) –

+2

Wenn Sie 'Wonderous.class' verwendet haben, könnte Sonar es akzeptieren. Schließlich würden Unterklassen immer noch dieselbe Klasse und dasselbe Paket im Klassenpfad verwenden. Wenn Sie den absoluten Ressourcenpfad verwenden, wäre das sicher, aber Sonar überprüft das wahrscheinlich nicht. Ich werde meine Antwort bearbeiten, um sie klarer zu machen. –