0

topics and subs are two private ArrayList filled by remote Strings and ISubs (interface)

private synchronized void notify(MyMessage msg){
    for(int i=0; i<topics.size(); i++){
        if(topics.get(i).equalsIgnoreCase(msg.getTopic())){
            try {
                subs.get(i).getListener().onMessage(msg);
            } catch (RemoteException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

notify() is called by publish(MyMessage msg) method and it gets a remote MyMessage object

 public boolean publish(MyMessage msg) throws RemoteException {

    if(!total.tryAcquire()){
        System.out.println("Publish respinta");
        return false;
    }

    try {
        concurrent.acquire();

        mutex.acquire();
        FileWriter file = new FileWriter("messaggi.txt",true);
        BufferedWriter bw = new BufferedWriter(file);
        bw.write(msg.getTopic()+": "+msg.getContenuto());
        bw.newLine();
        bw.flush();
        bw.close();
        mutex.release();

        notify(msg);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally{
        concurrent.release();
        total.release();
    }
    return true;
}

Everytime publish() is invoked I get the following exception:

java.lang.NullPointerException at server.MessageServer.notify(MessageServer.java:87) at server.MessageServer.publish(MessageServer.java:61) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) at sun.rmi.transport.Transport$1.run(Unknown Source) at sun.rmi.transport.Transport$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.Transport.serviceCall(Unknown Source) at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source) at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source) at sun.rmi.server.UnicastRef.invoke(Unknown Source) at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source) at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source) at com.sun.proxy.$Proxy0.publish(Unknown Source) at publisher.PublisherThread.run(PublisherThread.java:22)

Obviously topics and subs are filled before publish() is invoked.

EDIT: alright, I found the issue, please don't kill me, I forgot to initialize the MsgListener in the Subscriber constructor.

0 Answers0