2013-06-18 15 views

risposta

2

Rendere la classe final in modo che non possa essere estesa. L'avviso è lì per impedire alla classe estesa (potenzialmente) di utilizzare risorse inesistenti.

+0

Contrassegnato come risposta accettata perché risolveva il problema nella nostra situazione particolare. Tuttavia, se non vuoi/puoi impostare la tua classe come ultima lettura più in basso ... –

3

L'unica cosa che posso immaginare perché Sonar sputa questo messaggio è perché una classe derivata può essere caricata da un classloader differente, quindi il file di testo potrebbe non essere trovato in quel momento. Avevo appena ignorare questo, rendere la classe finale come suggerito, o utilizzare un .class letterale, invece di getClass()

3

Il messaggio di errore da Sonar non sembra avere molto senso perché la risorsa inizia con una barra, e così viene cercato nella radice del percorso di classe. Tuttavia, Sonar non potrebbe verificare ciò che è nella stringa di risorse, e sarà quindi assume il percorso potrebbe essere un percorso relativo ..

Immaginate cosa accadrebbe se aveste scritto una stringa senza una barra:

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

L'URL avrebbe puntato a myWonderfulResource.txt nel pacchetto corrente. Ora, supponiamo di aver esteso la lezione in un altro pacchetto.

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

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

Quando un'istanza di Awesome cerca di ottenere il file di testo meraviglioso, sembra che sul percorso di classe in com/es/impressionante. Ma la risorsa Wonderful è in com/example. Awesome non lo troverà.

Per inciso, questo rapporto di errore viene da FindBugs, e la documentation per questo particolare bug è:

UI: L'utilizzo di GetResource può essere pericoloso se la classe è esteso (UI_INHERITANCE_UNSAFE_GETRESOURCE)

chiamata a questo. getClass(). getResource (...) potrebbe dare risultati diversi da quelli previsti se questa classe viene estesa da una classe in un altro pacchetto.

+0

Un buon punto, che rende il mio consiglio sull'uso di un .class letterale alquanto inutile. Ignorare funziona ancora se teniamo la "/" iniziale :-) –

+2

se hai usato 'Wonderous.class', Sonar potrebbe accettarlo. Dopotutto, le sottoclassi continuerebbero ad usare la stessa classe e lo stesso pacchetto nel percorso della classe. Se si utilizza il percorso della risorsa assoluta, sarebbe sicuro, ma probabilmente Sonar non controlla. Modificherò la mia risposta per renderla più chiara. –