带有singleton的侦听器的简单示例上的空指针异常

时间:2013-10-08 01:52:33

标签: java nullpointerexception singleton

我在这里有一个使用自定义监听器的单例的不同简单示例。我对其他一些代码有一个类似的问题,并决定制作这个例子。它显示与其他更复杂的代码相同的空指针问题。

空指针在这一行:

  listener.onPass(sendString);

任何想法如何解决问题,以及为什么会发生这种情况?

这里显示了三个类,StartSelector.java用于启动另一个类,Singleton.java类有一个监听器接口和一个单例,它向另一个类Singleton2.java发送一条短文本消息,这个其他类实现回调方法并接收文本消息String。

启动Singleton类

 public class StartSelector {

      public static void main(String args[]) {
      Singleton.getInstance();
      } // end main

 }

使用自定义侦听器发送String消息

 public class Singleton {

 private OnPassStringListener listener;
 private static Singleton instance;

 public static Singleton getInstance(){
      if(instance == null){
               instance = new Singleton();
           }
      }
   return instance;
 }

 private Singleton(){
     doIt();
 }

 private void doIt(){
     transmitString("test string from singleton class");
 }

 public void transmitString(String sendString) {
     listener.onPass(sendString);   <-- NULL POINTER EXCEPTION HERE
 }

 public interface OnPassStringListener {
     public void onPass(String stringSend);
 }    

 } // end class Singleton

从另一个类接收String消息 并实现接口的回调方法

public class Singleton2 implements Singleton.OnPassStringListener {

   public Singleton2() {
       System.out.println("singleton2 class started");
   }

    @Override
    public void onPass(String stringSend) {
        System.out.println("message received: " + stringSend);
    }

} // end class singleton2

4 个答案:

答案 0 :(得分:0)

您尚未在该代码中初始化侦听器。 NullPointerException 只表示您尝试使用的对象未指向有效对象。在定义值时或在类构造函数中初始化值。

private OnPassStringListener listener = new Singleton2();

private Singleton() {
    listener = new Singleton2();
    doIt();
}

答案 1 :(得分:0)

public static Singleton getInstance(){
      if(instance == null){
               instance = new Singleton();
           instance.setListener(new Singleton2());
           }
      }
   return instance;
 }

答案 2 :(得分:0)

两个选项。侦听器为null,或者某些代码INSIDE onPass()抛出NullPointerException。需要查看堆栈转储以了解它是哪一个。 (编辑。没关系,我错过了Singleton2的文本。所以是的,它肯定是前一个。第一个单例中的listener永远不会被初始化。你想初始化它,和/或检查null。 / p>

从技术上讲,解耦Singleton和Singleton2可能是一种很好的编程风格。在Observer模式('listener'提示词)中,listenee不知道它的监听器(除了它知道它监听器的非常通用的事实)。因此,如果您直接从Singleton1引用Singleton2,可以将其称为Listener以外的其他内容。

答案 3 :(得分:0)

您的侦听器为空。改变这一行

private OnPassStringListener listener;

private OnPassStringListener listener = new Singleton2();