繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM