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
- 解组调用头时发生I/O错误。
- 解组参数时发生I/O错误。
- 无效的方法编号或方法哈希。
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
尝试在非法端口上导出对象。