0

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

空指针在这一行:

  listener.onPass(sendString);

知道如何解决这个问题,为什么会这样?

这里展示了三个类,StartSelector.java用于启动其他类,Singleton.java类有一个监听接口和一个单例,它向其他类Singleton2.java发送一条短信,这个其他类实现了回调方法并接收短信字符串。

启动 Singleton 类

 public class StartSelector {

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

 }

使用自定义侦听器发送字符串消息

 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

4 回答 4

0

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

private OnPassStringListener listener = new Singleton2();

或者

private Singleton() {
    listener = new Singleton2();
    doIt();
}
于 2013-10-08T01:57:55.220 回答
0
public static Singleton getInstance(){
      if(instance == null){
               instance = new Singleton();
           instance.setListener(new Singleton2());
           }
      }
   return instance;
 }
于 2013-10-08T01:58:30.807 回答
0

两种选择。侦听器为 null,或者在 onPass() 内部的某些代码引发 NullPointerException。需要查看堆栈转储才能知道它是哪一个。(编辑。没关系,我错过了 Singleton2 的文本。所以是的,它肯定是前一个。你listener的第一个单例永远不会被初始化。你想初始化它,和/或检查 null。

从技术上讲,分离 Singleton 和 Singleton2 可能是一种很好的编程风格。在观察者模式中(“听者”这个词暗示了这一点),听者不知道它的听者(除了它知道它一个听者这一非常普遍的事实之外)。所以,如果你直接从 Singleton1 中引用 Singleton2,也许可以称它为 Listener 以外的东西。

于 2013-10-08T01:59:38.233 回答
0

你的听众是空的。更改此行

private OnPassStringListener listener;

private OnPassStringListener listener = new Singleton2();
于 2013-10-08T02:01:56.453 回答