Search code examples
javarmi

RMI method call throws NPE


I have:

  1. GUI which asked for input from user to create new user.
  2. Once clicked submit, it will call createPlayer (throws RemoteException) in AdminModule class.
  3. I am passing the parameters to AdminInterfaceImplementation (throws RemoteException) to invoke another method in PlayersData class to create object. Notice the method in PlayersData doesn't get invoked.

I am running RMI and have tested the connection with simple println and it works fine. However, the method still not invoke. Please kindly advise what could be the problem.

Does the method in PlayersData need to throw RemoteException in order to work?

// AdminModule

public static void main(String args[])
    {
        try {

            System.out.println("Hi from AdminModule");
            AdminFactory theWorks = (AdminFactory) Naming.lookup("rmi://localhost:13456/AdminInterfaceTest");
            myAdminInterface = theWorks.newAdminInterface();
            new AdminModule().run();
        }

        catch (Exception e)
        {
            System.out.println("catch" + e);
        }
    }

    public void createPlayer(String name, String password, int chips) throws RemoteException
        {
            String hashedPassword = Utility.getHash(password);
            myAdminInterface.createPlayer(name, hashedPassword, chips);    
            System.out.println ("Create Player from Admin Module: " + name + ", " + hashedPassword + ", " + chips);

        }


    // AdminInterfaceImplementation

    public void createPlayer(String name, String password, int chips) throws RemoteException {
            System.out.println ("Create Player from Admin Interface: " + name + ", " + password + ", " + chips);  // can display in console
            adminModule.test(name, password, chips);  //this method doesn't get invoked.
        }


//PlayersData   - not invoke

public void addPlayer(String name, String password, int chips) {

        System.out.println ("Create Player from PlayersData: " + name + ", " + password + ", " + chips);
        Player p = new Player (name, password, chips);
        playerList.add(p);
        JOptionPane.showMessageDialog(null, "Player created successfully", "Display", 
                JOptionPane.INFORMATION_MESSAGE);
}

Update:

The method gets invoked now but having below error...

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at AdminInterfaceImpl.createPlayer(AdminInterfaceImpl.java:13)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:303)
    at sun.rmi.transport.Transport$1.run(Transport.java:159)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
    at java.lang.Thread.run(Thread.java:695)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
    at AdminInterfaceImpl_Stub.createPlayer(Unknown Source)
    at AdminModule.createPlayer(AdminModule.java:79)
    at AdminMenuFrame$6.actionPerformed(AdminMenuFrame.java:198)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6414)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)

Solution

  • Problem was solved by initialising PlayersData class object inside method createPlayer.