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; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.