我在这里有一个使用自定义监听器的单例的不同简单示例。我对其他一些代码有一个类似的问题,并决定制作这个例子。它显示与其他更复杂的代码相同的空指针问题。
空指针在这一行:
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
答案 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();