2014-12-28 59 views
3

我有这样一个类:从另一个类访问变量在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

回答

3

MainActivity mainClass;是嵌套类TestMessageListener因此,如果您不会初始化它,它会使用默认值的引用是null这意味着

mainClass.conversationsMap.get("test"); 

将尝试调用上的空conversationsMap.get("test")被初始化的一个领域,但因为null没有任何字段或方法获得NullPointerException。

通常解决这类问题,你要么自己与新的实例

MainActivity mainClass = new MainActivity(); 

初始化mainClass但可能更好的选择是让用户或其他处理通已经创建的实例TestMessageListener类。要在TestMessageListener构造做到这一点,你可以创建二传手,

public void setMainActivity(MainActivity mainClass){ 
    this.mainClass = mainClass; 
} 

或接受MainActivity

public TestMessageListener(MainActivity mainClass){ 
    this.mainClass = mainClass; 
} 

我不是Android开发者,使他们能够更好的办法,如可能从注册某种得到这个实例Activity容器,但我不能帮你在这种情况下。

+0

嗯,我明白了,但我该如何解决这个问题? – Okan

+0

它固定但是这行仍然给予nullpointer:((ConversationsAdapter)mainClass.conversationsAdapter).updateConversations(mainClass.conversationsList);你知道为什么吗 ?我有一个主要类中的conversationsAdapter类(它是公开的) – Okan

+0

@Okan对不起,是AFK。无论如何,有些东西告诉我,这与TestMessageListener(未初始化的字段)中的问题相同,但我无法确定是否看不到会让我重现问题的代码。 – Pshemo

1

您没有任何MainActivity实例。

解决办法是:

MainActivity mainClass =新MainActivity();

2

你可以通过在MainActivity上下文连接构造,然后在TestMessageListener只是这样做:

MainActivity mainClass = (MainActivity) mContext; 
1
public class TestMessageListener implements MessageListener { 
      MainActivity mainClass = new MainActivity(); 
    } 

你需要mainClass的一个实例,以便与它进行交互。

1

你没有初始化mainClass,这就是为什么你得到空指针。 您可以创建新的主要业务(但请记住,你的地图不是静态的,那么你所做的任何修改可能会因在那里你让他们丢失)像

MainActivity mainClass = new MainActivity(); 

或创建Connection类,它接受一个构造函数context并将其主要活动传递给它并稍后在您的TestMessageListener中使用它。例如。

private MainAcitivity mainClass; 
public Connection(Context context) { 
mainClass = (MainAcitivity) context; 
}