我有一个这样的课程:
MainActivity.java
public class MainActivity extends FragmentActivity {
/* I removed other methods */
public Map<String, Conversation> conversationsMap = new LinkedHashMap<>();
}
Connection.java
public class Connection {
/* I removed other methods */
public class TestMessageListener implements MessageListener {
MainActivity mainClass;
public void someMethod() {
mainClass.conversationsMap.get("test"); /// This line is returning nullpointer exception
}
}
}
为什么我无法从其他班级访问conversationsMap
?
答案 0 :(得分:4)
MainActivity mainClass;
是嵌套类TestMessageListener
的字段,因此如果您不对其进行初始化,则会使用默认值对其进行初始化,引用为null
,这意味着
mainClass.conversationsMap.get("test");
将尝试在null上调用conversationsMap.get("test")
,但由于null
没有任何字段或方法,因此您将获得NullPointerException。
通常要解决此类问题,您可以使用新实例
自行初始化mainClass
MainActivity mainClass = new MainActivity();
但可能更好的选择是让用户或其他进程将已创建的实例传递给TestMessageListener
类。为此,您可以创建setter,
public void setMainActivity(MainActivity mainClass){
this.mainClass = mainClass;
}
或接受MainActivity
构造函数
TestMessageListener
public TestMessageListener(MainActivity mainClass){
this.mainClass = mainClass;
}
我不是Android开发人员,所以他们可以采用更好的方式,例如从某些注册的Activity
容器中获取此实例,但在这种情况下我无法帮助您。
答案 1 :(得分:3)
您可以将MainActivity上下文传递给Connection构造函数,然后在TestMessageListener中执行以下操作:
MainActivity mainClass = (MainActivity) mContext;
答案 2 :(得分:2)
您没有任何MainActivity实例。
解决方案是:
MainActivity mainClass = new MainActivity();
答案 3 :(得分:2)
你没有初始化mainClass,这就是你得到空指针的原因。 您可以创建新的主要活动(但请记住,您的地图不是静态的,因此您所做的任何修改可能会丢失,具体取决于您制作的地方),例如
MainActivity mainClass = new MainActivity();
或者在Connection
类中创建一个构造函数,该构造函数接受context
并将主要活动传递给它,然后在TestMessageListener
内使用它。 E.g。
private MainAcitivity mainClass;
public Connection(Context context) {
mainClass = (MainAcitivity) context;
}
答案 4 :(得分:1)
public class TestMessageListener implements MessageListener {
MainActivity mainClass = new MainActivity();
}
您需要一个mainClass实例才能与之交互。