-1

最近、私は再び Java を使い始めましたが、RMI にはかなり行き詰まっています。無効化された関数で動作させることができましたが、ネットワーク経由で文字列を返すことができないようです。

私が間違っていることを誰かが知っていますか?

Main.java:

package RMI;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Random;

public class Main extends UnicastRemoteObject implements Main_Interface {
    private Random random;
    private boolean coin = false;

    public Main() throws RemoteException { ; }

    public String flipCoin() throws RemoteException {
        coin = random.nextBoolean();

        if(coin) {
            System.out.println("Throwing Head");
            return "Head";
        } else {
            System.out.println("Throwing Tail");
            return "Tail";
        }
    }

    public void test() throws RemoteException {
        System.out.println("Test succesful");
    }
}

Main_Interface.java:

package RMI;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Main_Interface extends Remote {
    String flipCoin() throws RemoteException;
    void test() throws RemoteException;
}

Client.java (重要でないコードから削除):

package Client;

import RMI.Main_Interface;
import java.io.*;
import java.net.InetAddress;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Client {
    public static void main(String[] args) {
        String          line    = null;
        boolean         coin    = false;
        Main_Interface  conn    = null;

        try {
            String location = InetAddress.getLocalHost().getHostName();
            Registry myRegistry = LocateRegistry.getRegistry(location, 1099);
            conn = (Main_Interface) myRegistry.lookup("ISA");
            //conn = (Main_Interface) Naming.lookup("ISA");
        } catch (Exception e) {
            System.out.println("Server could not be found at "+location);
            System.exit(0);
        }

        try {
            conn.test()
            System.out.println("Here");
            if(conn.flipCoin().equals("Head")){
                System.out.println("Succes");
            }
            System.out.println("Here");
            if(coin) {
                System.out.println("Throwed Head");
            } else {
                System.out.println("Throwed Tail");
            }
        } catch (Exception e) {
            System.out.println("Could not execute the command...");
        }
    }
}

お察しのとおり、test() 関数は完全に実行されますが、flipCoin() 関数は例外をスローします。

4

1 に答える 1

3

正確にはどのような例外がスローされますか?

NullPointerException の場合:クラスで初期化randomすることはありません。コンストラクターに次のMainようなものを入れますrandom = new Random();

于 2012-12-17T21:33:43.303 に答える