当我的代码尝试通过RMI发送反序列化的对象时,如何引发异常?

时间:2014-01-14 22:24:20

标签: java exception serialization exception-handling rmi

我在使用的代码库上遇到错误。某些值未从一个进程传递到另一个进程。经过多次挫折之后,我将罪魁祸首缩小为单一的RMI电话。客户端进程将调用从服务器检索一些数据。该方法返回某个类的ArrayList。调试显示服务器正确运行该方法,但客户端永远不会重新获得控制权。客户端只是挂起。深入研究,我意识到客户端所需的类没有实现Serializable。改变那个解决了问题。 Java版本是1.6。

public interface RMIServer extends Remote{
    public ArrayList<MyObject> getObjects() throws RemoteException;
}

public class MyRMIServer implements RMIServer{
    public ArrayList<MyObject> getObjects() throws RemoteException{
        //All of the following code is called
        ArrayList<MyObject> objects = new ArrayList<MyObject>();
        objects.add(new MyObject());
        objects.add(new MyObject());
        objects.add(new MyObject());
        return objects;
    }
}

public class RMIClient{
    public static void main(String args[]){
        RMIServer rmiServer = (RMIServer)Namespace.lookup("localhost/rmiServer");
        ArrayList<MyObject> listOfObjects = rmiServer.getObjects();
        System.out.println("This is never called");
    }
}

我的问题是,有没有办法让客户端或服务器在发生这种情况时抛出异常?

2 个答案:

答案 0 :(得分:0)

  

我的问题是,有没有办法让客户端或服务器在发生这种情况时抛出异常?

它会引发异常。 NotSerializableException。在这种情况下,客户端将在ServerException中包含它。您的客户端代码无法编译,因此您声称不会抛出任何异常并且客户端永远不会重新获得控制权而缺乏可靠性。

答案 1 :(得分:0)

我不知道我是否理解你的问题,但如果你想抛出异常,你可以使用:

throw new YourCustomException();

或者您可以在必要时使用try catch捕获异常但当然您应该只执行此操作来处理您知道的异常,例如输入错误数据的用户并且您想要告诉用户这是错误的发生的情况。

但请确保您修复的错误是固定的,就像序列化应该序列化的对象一样。这些是通过网络传输的对象。