Acceder a una variable de otra clase en java
Tengo una clase como esta:
MainActivity.java
public class MainActivity extends FragmentActivity { /* I removed other methods */ public Map<String, Conversation> conversationsMap = new LinkedHashMap<>(); }
Y 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 } } }
¿Por qué no puedo acceder a conversationsMap
desde otra clase?
MainActivity mainClass;
es un campo de la clase anidada TestMessageListener
así que si no lo inicializas se inicializará con el valor por defecto que para las referencias es null
que significa que
mainClass.conversationsMap.get("test");
intentará invocar conversationsMap.get("test")
en null, pero como null
no tiene ningún campo o método, obtiene NullPointerException.
Generalmente para resolver este tipo de problema, ya sea inicializar mainClass
usted mismo con la nueva instancia
MainActivity mainClass = new MainActivity();
pero probablemente la mejor opción es permitir que el usuario u otro proceso pase la instancia ya creada a la clase TestMessageListener
. Para hacer esto usted puede crear setter,
public void setMainActivity(MainActivity mainClass){ this.mainClass = mainClass; }
o aceptar MainActivity
en el constructor TestMessageListener
public TestMessageListener(MainActivity mainClass){ this.mainClass = mainClass; }
No soy desarrollador de Android por lo que pueden ser incluso mejores maneras, como quizás obtener esta instancia de algún tipo registrado contenedores de la Activity
, pero no puedo ayudarle en este caso.
Puede pasar el contexto MainActivity al constructor Connection y, a continuación, en TestMessageListener, haga algo como:
MainActivity mainClass = (MainActivity) mContext;
No tiene ninguna instancia de MainActivity.
La solución es:
MainActivity mainClass = new MainActivity ();
public class TestMessageListener implements MessageListener { MainActivity mainClass = new MainActivity(); }
Necesitas una instancia de mainClass para interactuar con ella.
Usted no ha intialized mainClass, es por eso que está recibiendo puntero nulo. Puede crear una nueva actividad Principal (pero recuerde que su mapa no es estático, por lo que cualquier modificación que haya realizado podría perderse dependiendo de dónde los haya hecho), como
MainActivity mainClass = new MainActivity();
O bien, cree un constructor en la clase Connection
que acepte el context
y pase la actividad principal a él y utilícelo posteriormente dentro de su TestMessageListener
. P.ej
private MainAcitivity mainClass; public Connection(Context context) { mainClass = (MainAcitivity) context; }