[英]java - Access variable in child class, given a superclass, from another class
[英]Access a variable from another class in java
我有一个这样的课:
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
?
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;
}
或接受TestMessageListener
构造函数中的MainActivity
public TestMessageListener(MainActivity mainClass){
this.mainClass = mainClass;
}
我不是Android开发人员,所以他们可以更好的方式,比如可能从某些已注册的Activity
容器获取此实例,但在这种情况下我无法帮助你。
您可以将MainActivity上下文传递给Connection构造函数,然后在TestMessageListener中执行以下操作:
MainActivity mainClass = (MainActivity) mContext;
您没有任何MainActivity实例。
解决方案是:
MainActivity mainClass = new MainActivity();
你没有初始化mainClass,这就是你得到空指针的原因。 您可以创建新的Main活动(但请记住,您的地图不是静态的,因此您所做的任何修改可能会丢失,具体取决于您制作它们的地方)
MainActivity mainClass = new MainActivity();
或者在Connection
类中创建一个构造函数,该构造函数接受context
并将Main Activity传递给它,然后在TestMessageListener
使用它。 例如
private MainAcitivity mainClass;
public Connection(Context context) {
mainClass = (MainAcitivity) context;
}
public class TestMessageListener implements MessageListener {
MainActivity mainClass = new MainActivity();
}
您需要一个mainClass实例才能与之交互。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.