繁体   English   中英

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

[英]null pointer exception on simple example of listener with singleton

我在这里有一个使用自定义侦听器的单例的简单示例。 我在使用其他代码时遇到了类似的问题,因此决定制作此示例。 它显示了与其他更复杂的代码相同的空指针问题。

空指针在此行上:

  listener.onPass(sendString);

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

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

开始单例课程

 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

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

private OnPassStringListener listener = new Singleton2();

要么

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

两种选择。 侦听器为null,或者某些代码INSIDE onPass()引发NullPointerException。 需要查看堆栈转储以了解它是哪一个。 (编辑。没关系,我错过了Singleton2的文本。所以是的,它肯定是前一个。您的第一个Singleton的listener器永远不会初始化。您想对其进行初始化,和/或检查是否为null。

从技术上讲,解耦Singleton和Singleton2可能是一种很好的编程风格。 在观察者模式(单词“ listener”暗示)中,被监听者不知道其监听器(除了非常普遍的事实,即它知道一个监听器)。 因此,如果您直接从Singleton1引用Singleton2,则可以将其命名为Listener以外的名称。

您的听众为空。 更改此行

private OnPassStringListener listener;

private OnPassStringListener listener = new Singleton2();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM