2013-06-18 13 views

Odpowiedz

2

Utwórz klasę final, więc nie można jej przedłużyć. Ostrzeżenie jest tam, aby zapobiec rozszerzeniu klasy (potencjalnie) próbując użyć nieistniejących zasobów.

+0

Oznaczono jako zaakceptowaną odpowiedź, ponieważ rozwiązało to problem w naszej konkretnej sytuacji. Jednak jeśli nie chcesz/możesz ustawić swoją klasę jako ostateczną przeczytaj poniżej ... –

3

Jedyne, co mogę sobie wyobrazić, to dlaczego Sonar wypluwa ten komunikat, ponieważ klasa pochodna może być ładowana przez inny program ładujący klasy, więc twój plik tekstowy może wtedy nie zostać znaleziony. bym po prostu zignorować to, sprawiają, że klasa końcowy zgodnie z sugestią lub użyć .class dosłowne zamiast getClass()

3

komunikat o błędzie z Sonar nie wydaje sensu, ponieważ zasób rozpoczyna się ukośnikiem, a więc znajduje się w katalogu głównym ścieżki zajęć. Jednak Sonar nie może sprawdzić, co jest w ciągu zasobów, a zostanie on zakładać, ścieżka może być ścieżką względną ..

Wyobraź sobie, co by się stało, gdybyś napisał ciąg bez ukośnika:

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

Adres URL wskazywałby na myWonderfulResource.txt w bieżącym pakiecie. Załóżmy teraz, że rozszerzyłeś klasę w innej paczce.

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

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

Kiedy instancją Awesome próbuje uzyskać wspaniały plik tekstowy, wygląda go na ścieżce klasy COM/przykład/niesamowite. Ale zasób Wonderful jest w com/example. Awesome nie znajdzie.

Nawiasem mówiąc, ten raport o błędach pochodzi z FindBugs i documentation dla tego konkretnego błędu jest:

UI: Wykorzystanie getResource może być niebezpieczne, jeśli klasa jest przedłużony (UI_INHERITANCE_UNSAFE_GETRESOURCE)

Wywołanie tego. getClass(). getResource (...) może dać wyniki inne niż oczekiwane, jeśli klasa ta zostanie rozszerzona o klasę w innym pakiecie.

+0

Dobra rada, która sprawia, że ​​moja rada na temat używania liter .class jest nieco bezużyteczna. Ignorowanie nadal działa, jeśli zachowamy wiodący "/" :-) –

+2

, jeśli użyłeś 'Wonderous.class', Sonar może to zaakceptować. W końcu podklasy nadal używałyby tej samej klasy i tego samego pakietu w ścieżce klasy. Jeśli użyjesz bezwzględnej ścieżki zasobów, będzie to bezpieczne, ale Sonar prawdopodobnie nie sprawdza. Zmienię moją odpowiedź, aby była jaśniejsza. –

Powiązane problemy