RMI中的异常


A.1 导出远程对象时的异常

当创建一个扩展UnicastRemoteObject的远程对象类时,该对象被导出,意味着它可以接收来自外部Java虚拟机的调用,并可以作为参数或返回值在RMI调用中传递。对象可以在匿名端口或指定端口上导出。对于未扩展自UnicastRemoteObject的对象,使用java.rmi.server.UnicastRemoteObject.exportObject方法来显式导出对象。

java.rmi.StubNotFoundException

存根类未找到。

与存根同名的类发生名称冲突会导致以下错误之一:

由于错误的代码库导致的错误URL。

存根不是正确的类。

java.rmi.server.SkeletonNotFoundException

注意:自Java 2 SDK标准版v1.2起,此异常已被弃用

骨架类未找到。

与骨架同名的类发生名称冲突会导致以下错误之一:

由于错误的代码库导致的错误URL。

骨架不是正确的类。

java.rmi.server.ExportException

端口被另一个虚拟机使用。

A.2 RMI调用过程中的异常

java.rmi.UnknownHostException

未知主机。

java.rmi.ConnectException

连接被主机拒绝。

java.rmi.ConnectIOException

创建连接时发生I/O错误。

java.rmi.MarshalException

在编组传输头、编组调用头或编组参数时发生I/O错误。

java.rmi.NoSuchObjectException

尝试调用不再可用的对象的方法。

java.rmi.StubNotFoundException

远程对象未导出。

A.3 返回过程中的异常或错误

java.rmi.UnmarshalException

损坏的流导致在以下情况下发生I/O或协议错误:

未找到返回值类。

java.rmi.UnexpectedException

发生未在方法签名中提到的异常(不包括运行时异常)。UnexpectedException异常对象包含服务器抛出的基础异常。

java.rmi.ServerError

服务器在执行远程方法时发生的任何错误。ServerError异常对象包含服务器抛出的基础错误。

java.rmi.ServerException

在服务器处理调用时抛出此异常,当服务器在解组参数或执行远程方法本身时抛出RemoteException。有关示例,请参见第A.3.1节,“java.rmi.ServerException可能的原因”

java.rmi.ServerRuntimeException

注意:自Java 2 SDK标准版v1.2起,此异常已被弃用

此异常不会由运行Java 2 SDK标准版v1.2兼容版本的服务器抛出。一个RuntimeException会完整传播给客户端。

A.3.1 java.rmi.ServerException可能的原因

这些是服务器在执行远程方法调用时可能发生的一些基础异常。这些异常被包装在java.rmi.ServerException中;也就是说java.rmi.ServerException包含供客户端提取的原始异常。这些异常被ServerException包装,以便客户端知道自己在服务器上的远程方法调用并未失败,而是服务器上的次要远程方法调用失败。

java.rmi.server.SkeletonMismatchException

注意:自Java 2 SDK标准版v1.2起,此异常已被弃用

存根和骨架的哈希不匹配。

java.rmi.UnmarshalException

java.rmi.MarshalException

编组返回时的协议错误。

java.rmi.RemoteException

由服务器进行远程调用导致的RemoteException

A.4 命名异常

以下表格列出了java.rmi.Naming类和java.rmi.registry.Registry接口中指定的异常。

java.rmi.AccessException

操作不允许。注册表将绑定、重新绑定和解绑限制为同一主机。查找操作可以来自任何主机。

java.rmi.AlreadyBoundException

尝试绑定已经绑定的名称。

java.rmi.NotBoundException

尝试查找未绑定的名称。

java.rmi.UnknownHostException

尝试联系未知主机上的注册表。

A.5 激活异常

激活机制已从系统中移除。

A.6 其他异常

java.rmi.RMISecurityException

注意:自Java 2 SDK标准版v1.2起,此异常已被弃用

RMISecurityManager抛出的安全异常。

java.rmi.server.ServerCloneException

克隆失败。

java.rmi.server.ServerNotActiveException

在远程服务器未在远程方法中执行时,尝试通过RemoteServer.getClientHost方法获取客户端主机。

java.rmi.server.SocketSecurityException

尝试在非法端口上导出对象。