从java中的另一个类访问变量

时间:2014-12-28 23:51:46

标签: java android

我有一个这样的课程:

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

5 个答案:

答案 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实例才能与之交互。