Java 自定义侦听器为空
我在Android上使用过监听器,从来没有遇到过任何问题,但是今天当它试图用Java创建一个简单的监听器时,我得到了NullPointerException,这是什么原因,我如何修复它 这包括3个类:ListenerMainStart.java、SendMessageClass.java和ReceiveMessageClass.javaJava 自定义侦听器为空,java,listener,actionlistener,Java,Listener,Actionlistener,我在Android上使用过监听器,从来没有遇到过任何问题,但是今天当它试图用Java创建一个简单的监听器时,我得到了NullPointerException,这是什么原因,我如何修复它 这包括3个类:ListenerMainStart.java、SendMessageClass.java和ReceiveMessageClass.java public class SendMessageClass { public OnStringRequestedListener onStringListen
public class SendMessageClass {
public OnStringRequestedListener onStringListener;
public Timer timer;
public SendMessageClass() {
timer = new Timer();
timer.schedule(new TimerAction(), 3000);
}
public void SetOnStringRequestedListener(OnStringRequestedListener listener) {
System.out.println("value of onStringListener " + onStringListener.toString());
onStringListener = listener;
}
public interface OnStringRequestedListener {
public void passString(String sendString);
}
public class TimerAction extends TimerTask {
@Override
public void run() {
if (onStringListener!=null){
// pass string to other class, ONSTRINGLISTENER IS ALWASY NULL
onStringListener.passString("string sent from SendMessageclass");
} else {
System.out.println("onStringListener is null");
}
}
}
}
public class ReceiveMessageClass implements SendMessageClass.OnStringRequestedListener {
SendMessageClass senderClass;
public ReceiveMessageClass() {
// instantiate class
senderClass = new SendMessageClass();
// set the listener to the class
senderClass.SetOnStringRequestedListener(this);
}
@Override
public void passString(String sendString) {
// do action when string is sent from other class
System.out.println("message recevied from other class is " + sendString);
}
}
ListenerMartart.java
public class ListenerMainStart {
public static void main(String[] args) {
new SendMessageClass();
}
}
SendMessageClass.java
public class SendMessageClass {
public OnStringRequestedListener onStringListener;
public Timer timer;
public SendMessageClass() {
timer = new Timer();
timer.schedule(new TimerAction(), 3000);
}
public void SetOnStringRequestedListener(OnStringRequestedListener listener) {
System.out.println("value of onStringListener " + onStringListener.toString());
onStringListener = listener;
}
public interface OnStringRequestedListener {
public void passString(String sendString);
}
public class TimerAction extends TimerTask {
@Override
public void run() {
if (onStringListener!=null){
// pass string to other class, ONSTRINGLISTENER IS ALWASY NULL
onStringListener.passString("string sent from SendMessageclass");
} else {
System.out.println("onStringListener is null");
}
}
}
}
public class ReceiveMessageClass implements SendMessageClass.OnStringRequestedListener {
SendMessageClass senderClass;
public ReceiveMessageClass() {
// instantiate class
senderClass = new SendMessageClass();
// set the listener to the class
senderClass.SetOnStringRequestedListener(this);
}
@Override
public void passString(String sendString) {
// do action when string is sent from other class
System.out.println("message recevied from other class is " + sendString);
}
}
ReceiveMessageClass.java
public class SendMessageClass {
public OnStringRequestedListener onStringListener;
public Timer timer;
public SendMessageClass() {
timer = new Timer();
timer.schedule(new TimerAction(), 3000);
}
public void SetOnStringRequestedListener(OnStringRequestedListener listener) {
System.out.println("value of onStringListener " + onStringListener.toString());
onStringListener = listener;
}
public interface OnStringRequestedListener {
public void passString(String sendString);
}
public class TimerAction extends TimerTask {
@Override
public void run() {
if (onStringListener!=null){
// pass string to other class, ONSTRINGLISTENER IS ALWASY NULL
onStringListener.passString("string sent from SendMessageclass");
} else {
System.out.println("onStringListener is null");
}
}
}
}
public class ReceiveMessageClass implements SendMessageClass.OnStringRequestedListener {
SendMessageClass senderClass;
public ReceiveMessageClass() {
// instantiate class
senderClass = new SendMessageClass();
// set the listener to the class
senderClass.SetOnStringRequestedListener(this);
}
@Override
public void passString(String sendString) {
// do action when string is sent from other class
System.out.println("message recevied from other class is " + sendString);
}
}
在打开计时器之前,似乎需要调用“setOnStringRequestListener”。实际上,该方法从未被调用,onStringListener也从未被设置。你确实调用了接收器中的那一行代码,但当然在那里太晚了。您的main应该实例化接收方和发送方,setOnStringRequestListener,然后设置计时器
SendMessageClass send = new SendMessageClass();
ReceiveMessageClass recv = new ReceiveMessageClass()
send.SetOnStringRequestedListener(recv)
编辑:然后取出接收方中引用发送方的任何代码。使用监听器背后的想法是,这两个类彼此并不直接了解。用Java实例化监听器的正确或标准方法是什么?使用android时,我会在一个片段的onAttach方法中这样做,但不确定最好的方法是什么。在新的SendMessageClass()之后,程序不会立即死亡?我没有死,但它打印出消息“onStringListener为null”并停止,我说的是main()除了new SendMessageClass()之外什么都没有……谢谢,它现在可以工作了。我还从main方法启动了计时器。Java和Android必须以不同的方式进行。