使用单例模式添加任务实例到数组时抛出NullReferenceException异常排查
相关实现代码
public class IntroductionQuest : Quest { //SINGLTON REALIZATION protected static IntroductionQuest instance; private IntroductionQuest(string Name) { name = Name; } public static IntroductionQuest Initialize(string Name) { if (instance == null) { instance = new IntroductionQuest(Name); PublicData.Quests.Add(instance); } return instance; } //SINGLETON REALIZATION }
触发NullReferenceException异常的可能原因
PublicData.Quests未完成初始化:这是最常见的触发原因。如果你仅声明了该字段(例如public static List<Quest> Quests;),但没有给它赋值为实例化的集合对象(例如public static List<Quest> Quests = new List<Quest>();),调用Add方法时就会直接抛出空引用异常。如果Quests是数组类型,未实例化时访问成员也会触发相同问题。PublicData类本身未实例化:如果PublicData不是静态类,你访问它的Quests成员前没有创建PublicData的实例,访问Quests时就会抛出空引用。- 多线程并发调用
Initialize方法:当前的单例实现没有加锁,若多个线程同时判断instance == null进入实例化分支,极端情况下会出现执行Add操作时instance还未完成构造赋值的问题。 - 基类
Quest的构造逻辑存在空引用:子类的私有构造函数没有显式调用基类的有参构造,会默认调用基类的无参构造,如果基类无参构造中存在访问空对象的逻辑,会导致IntroductionQuest实例化失败,触发异常。 name字段的赋值逻辑异常:如果基类Quest中的name属性自定义了setter逻辑,内部存在访问空对象的操作,赋值时也会抛出空引用,尤其是传入的Name参数为null触发特殊分支的场景。
内容的提问来源于stack exchange,提问作者Алексей
相关产品推荐
相关产品推荐

