Sonar 在我们的 Java 项目中指示此错误。欢迎任何有关安全编程的建议!
URL url = getClass().getResource("/myWonderfulResource.txt");
if (url == null) {
throw new IllegalStateException("File not found: /myWonderfulResource.txt");
}
Sonar 在我们的 Java 项目中指示此错误。欢迎任何有关安全编程的建议!
URL url = getClass().getResource("/myWonderfulResource.txt");
if (url == null) {
throw new IllegalStateException("File not found: /myWonderfulResource.txt");
}
制作课程final
,使其无法扩展。警告是为了防止扩展类(可能)尝试使用不存在的资源。
我唯一能想象声纳为什么会吐出这条消息是因为派生类可能由不同的类加载器加载,所以你的文本文件可能找不到。我只是忽略这一点,按照建议使课程成为最终课程,或者使用.class
文字而不是getClass()
来自 Sonar 的错误消息似乎没有多大意义,因为资源以斜杠开头,因此在类路径的根目录中查找。但是,Sonar 可能不会检查资源字符串中的内容,然后它将假定路径可能是相对路径。
想象一下如果你写一个没有斜线的字符串会发生什么:
URL url = getClass().getResource("myWonderfulResource.txt");
该 url 将一直指向myWonderfulResource.txt
当前包中。现在,假设您在不同的包中扩展了该类。
package com.example;
public class Wonderous {...}
package com.example.awesome;
public class Awesome extends Wonderous {...}
当一个实例Awesome
试图获取美妙的文本文件时,它会在 com/example/awesome 中的类路径中查找它。但是Wonderful
的 资源 在com/example
. Awesome
不会找到它。
顺便说一句,这个错误报告来自 FindBugs,这个特定错误的文档是:
UI:如果扩展类,GetResource 的使用可能不安全 (UI_INHERITANCE_UNSAFE_GETRESOURCE)
如果此类由另一个包中的类扩展,则调用 this.getClass().getResource(...) 可能会产生与预期不同的结果。