2013-06-18 3 views

답변

2

클래스를 final으로 확장 할 수 없도록하십시오. 경고는 확장 클래스 (잠재적으로)가 존재하지 않는 리소스를 사용하려고하는 것을 방지하기위한 것입니다.

+0

Google의 특정 상황에서 문제가 해결 되었기 때문에이 답변을 허용 된 답변으로 표시했습니다. 그러나 당신이 원하지 않거나 클래스를 final read more로 설정하면 ... –

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 : 클래스가이 호출 (UI_INHERITANCE_UNSAFE_GETRESOURCE)

을 연장하는 경우의 getResource의 사용이 안전하지 않을 수 있습니다. 이 클래스가 다른 패키지의 클래스에 의해 확장되었을 경우, getClass(). getResource (...)는 예상과 다른 결과를 줄 수 있습니다.

+0

좋은 점. .class 리터럴을 사용하는 것에 대한 조언을 다소 쓸모 없게 만듭니다. "Wonderous.class"를 사용했다면, 여전히 "/":-) –

+2

을 사용하면 무시해도 작동합니다. 결국, 하위 클래스는 여전히 클래스 경로에서 동일한 클래스와 동일한 패키지를 사용합니다. 절대 리소스 경로를 사용하면 안전하지만 Sonar는 아마 확인하지 않습니다. 내 대답을 편집하여 명확하게 만들거야. –