자바 프로젝트에서이 오류를 나타내는 중입니다. 안전한 프로그래밍을위한 제안은 언제나 환영합니다!소나 플래그 "나쁜 습관": 클래스가 확장 된 경우 XYZ에서 GetResource 사용이 안전하지 않을 수 있습니다.
답변
클래스를 final
으로 확장 할 수 없도록하십시오. 경고는 확장 클래스 (잠재적으로)가 존재하지 않는 리소스를 사용하려고하는 것을 방지하기위한 것입니다.
소나가 왜이 메시지를 내뱉는 지 상상할 수있는 것은 파생 클래스가 다른 클래스 로더에 의해로드 될 수 있으므로 텍스트 파일이 발견되지 않을 수 있기 때문입니다. 난 그냥이 무시 제안 클래스가 최종 확인 또는 자원이 슬래시로 시작하기 때문에 많은 이해하지 않는 것 대신 getClass()
수중 음파 탐지기에서 오류 메시지의 .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 (...)는 예상과 다른 결과를 줄 수 있습니다.
좋은 점. .class 리터럴을 사용하는 것에 대한 조언을 다소 쓸모 없게 만듭니다. "Wonderous.class"를 사용했다면, 여전히 "/":-) –
을 사용하면 무시해도 작동합니다. 결국, 하위 클래스는 여전히 클래스 경로에서 동일한 클래스와 동일한 패키지를 사용합니다. 절대 리소스 경로를 사용하면 안전하지만 Sonar는 아마 확인하지 않습니다. 내 대답을 편집하여 명확하게 만들거야. –
Google의 특정 상황에서 문제가 해결 되었기 때문에이 답변을 허용 된 답변으로 표시했습니다. 그러나 당신이 원하지 않거나 클래스를 final read more로 설정하면 ... –