LibGDX中调用getList方法触发Nullpointer Exception问题求助
LibGDX中调用
getList方法触发NullPointerException的解决办法 问题根源
空指针异常的直接触发点是theClass.isInstance(a)这行代码——当Class.forName(className)执行失败时,theClass会保持初始化的null值,后续循环调用isInstance方法就会抛出空指针。
导致Class.forName失败的常见原因:
- 传入的类名是简单名称(比如
"Rock")而非全限定类名(比如"com.yourgame.Rock"),JVM找不到对应的类 - 类名拼写错误
- 类未被正确加载
修复方案
1. 修复原方法的空指针问题
修改getList方法,在类加载失败时直接返回空列表(或抛出明确异常),避免后续代码执行:
public static ArrayList<BaseActor> getList(Stage stage, String className) { ArrayList<BaseActor> list = new ArrayList<BaseActor>(); Class<?> theClass; try { // 必须传入类的全限定名称,例如"com.yourgame.Rock" theClass = Class.forName(className); } catch (ClassNotFoundException error) { error.printStackTrace(); // 类加载失败时直接返回空列表,防止后续空指针 return list; // 也可以抛出运行时异常,让问题更明显: // throw new RuntimeException("无法加载指定类: " + className, error); } for (Actor a : stage.getActors()) { if (theClass.isInstance(a)) list.add((BaseActor)a); } return list; }
2. 更安全的重载方法(推荐)
直接传入Class对象替代字符串类名,彻底避免类名解析错误:
// 新增重载方法 public static ArrayList<BaseActor> getList(Stage stage, Class<? extends BaseActor> clazz) { ArrayList<BaseActor> list = new ArrayList<BaseActor>(); for (Actor a : stage.getActors()) { if (clazz.isInstance(a)) list.add((BaseActor)a); } return list; } // 调用方式(更简洁且无类名拼写风险) for (BaseActor rockActor : BaseActor.getList(mainStage, Rock.class)) turtle.preventOverlap(rockActor);
调用注意事项
如果坚持使用原字符串参数的方法,务必传入全限定类名——即包含包路径的完整类名,比如你的Rock类在com.yourgame.objects包下,要传入"com.yourgame.objects.Rock"而非"Rock"。
内容的提问来源于stack exchange,提问作者HermannGo
相关产品推荐
相关产品推荐

