2014-01-14 26 views
-1

我在我正在使用的代码库上遇到错误。某些值不是从一个过程传递到另一个过程。经过多次挫折之后,我将罪魁祸首缩小到一个单一的RMI电话。客户端进程会打电话从服务器中检索一些数据。该方法返回某个类的ArrayList。调试表明服务器正确运行该方法,但客户端从不重新获得控制权。客户端只是挂起。挖掘下来,我意识到客户需要的类不执行Serializable。改变这个问题解决了问题。 Java版本是1.6。当我的代码尝试通过RMI发送一个反序列化的对象时,如何引发异常?

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"); 
    } 
} 

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

回答

0

我的问题是,有什么办法可以导致客户端或服务器在发生这种情况时抛出异常吗?

它确实会抛出异常。 NotSerializableException。在这种情况下,客户端将收到它封装在ServerException中。你的客户端代码不能编译,所以你声称不会抛出异常,客户端永远不会重新获得控制权。

+0

当然,你从不想用bug来部署,但如果发生错误,你确实需要一种干净的方式来处理它。这似乎有点愚蠢。 – Yserbius

0

我不知道如果我明白你的问题,但如果你想抛出一个异常,你可以使用:

throw new YourCustomException(); 

或者,如果有必要,你可以赶上一个尝试捕捉异常,但当然你应该只做这件事来处理你知道的异常,比如用户输入错误的数据,并且如果发生这种情况,你想告诉用户它是错误的。

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

+0

这不是我正在寻找的。我想要一种方式在发生特定的几乎不可检测的异常时抛出异常。 – Yserbius

+0

那么,你说它几乎无法检测,所以他们是一种知道异常发生的方式。在这个时候,你必须抛出你自己的异常,或者捕获你正在谈论的这个异常。 – Digihash

相关问题