Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义侦听器为空_Java_Listener_Actionlistener - Fatal编程技术网

Java 自定义侦听器为空

Java 自定义侦听器为空,java,listener,actionlistener,Java,Listener,Actionlistener,我在Android上使用过监听器,从来没有遇到过任何问题,但是今天当它试图用Java创建一个简单的监听器时,我得到了NullPointerException,这是什么原因,我如何修复它 这包括3个类:ListenerMainStart.java、SendMessageClass.java和ReceiveMessageClass.java public class SendMessageClass { public OnStringRequestedListener onStringListen

我在Android上使用过监听器,从来没有遇到过任何问题,但是今天当它试图用Java创建一个简单的监听器时,我得到了NullPointerException,这是什么原因,我如何修复它

这包括3个类:ListenerMainStart.java、SendMessageClass.java和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);

}   
}
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必须以不同的方式进行。