解决创建ImageView加载JPG图片时Spotbugs检测出的UI_INHERITANCE_UNSAFE_GETRESOURCE错误
修复Spotbugs的UI_INHERITANCE_UNSAFE_GETRESOURCE警告
这个Spotbugs警告其实是在提醒你一个潜在的继承风险:当你的SlotsDisplay类被其他类继承后,子类调用getClass()会拿到子类的Class对象,而子类的类加载器可能无法找到你指定的图片资源——毕竟资源是放在父类的类路径下的,子类的类加载上下文说不定就找不到这个路径了。你右键直接运行父类的时候没问题,是因为此时getClass()就是SlotsDisplay.class,但一旦有子类继承并调用这个方法,就可能出现资源找不到的问题。
给你两个直接有效的修复方案:
方案一:用类名固定加载资源(根源解决警告)
把getClass()换成SlotsDisplay.class,这样不管有没有子类继承,都是用当前类的类加载器来加载资源,完全规避子类类加载器带来的风险。代码修改后如下:
private ImageView createImageView(String imageName){ ImageView imageView = new ImageView(new Image(SlotsDisplay.class.getResourceAsStream("/images/cards/" + imageName + ".jpg"))); imageView.setFitWidth(148); imageView.setFitHeight(210); return imageView; }
方案二:结合空值检查(更健壮)
按照IntelliJ的提示加上Objects.requireNonNull,可以在资源真的找不到时抛出明确的异常,方便你调试,而不是默默出现奇怪的错误。结合方案一的话,代码会更安全:
import java.util.Objects; import java.io.InputStream; // ... private ImageView createImageView(String imageName){ String resourcePath = "/images/cards/" + imageName + ".jpg"; InputStream imageStream = Objects.requireNonNull( SlotsDisplay.class.getResourceAsStream(resourcePath), "Failed to load image resource: " + resourcePath ); ImageView imageView = new ImageView(new Image(imageStream)); imageView.setFitWidth(148); imageView.setFitHeight(210); return imageView; }
这样修改后,Spotbugs的警告应该就会消失了,同时也让代码的健壮性提升了不少——既解决了继承带来的资源加载风险,又能在资源路径出错时及时给出明确提示。
内容的提问来源于stack exchange,提问作者Sebastian Sole
相关产品推荐
相关产品推荐

