[英]Null pointer exception while using simple example of jdbcTemplate in Spring
[英]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.