我是使用RMI的新手,我对使用异常相对较新.
我希望能够在RMI上抛出异常(这可能吗?)
我有一个简单的服务器,为学生提供服务,我有删除方法,如果学生不存在,我想抛出一个自定义的StudentNotFoundException异常,它扩展了RemoteException(这是一件好事吗?)
任何建议或指导将不胜感激.
服务器接口方法
/** * Delete a student on the server * * @param id of the student * @throws RemoteException * @throws StudentNotFoundException when a student is not found in the system */ void removeStudent(int id) throws RemoteException, StudentNotFoundException;
服务器方法实现
@Override public void removeStudent(int id) throws RemoteException, StudentNotFoundException { Student student = studentList.remove(id); if (student == null) { throw new StudentNotFoundException("Student with id:" + id + " not found in the system"); } }
客户端方法
private void removeStudent(int id) throws RemoteException { try { server.removeStudent(id); System.out.println("Removed student with id: " + id); } catch (StudentNotFoundException e) { System.out.println(e.getMessage()); } }
StudentNotFoundException
package studentserver.common; import java.rmi.RemoteException; public class StudentNotFoundException extends RemoteException { private static final long serialVersionUID = 1L; public StudentNotFoundException(String message) { super(message); } }
感谢您的回复,我现在设法解决了我的问题,并意识到扩展RemoteException是个坏主意.
抛出任何类型的异常(甚至是自定义异常)都可以,只需确保将它们打包到export .jar文件中(如果您使用的是需要手动执行此操作的Java版本).
但是,我不会将RemoteException子类化.如果存在某种连接问题,通常会抛出这些.据推测,您的客户端将处理与其他类型问题不同的连接问题.当您捕获RemoteException或连接到其他服务器时,您可能会告诉用户服务器已关闭.对于StudentNotFoundException,您可能希望为用户提供另一个输入学生信息的机会.
是的,可以通过RMI抛出异常.
不,扩展RemoteException
到报告应用程序故障并不是一个好主意.RemoteException
表示远程处理机制出现故障,如网络故障.使用适当的例外,java.lang.Exception
必要时扩展自己.
有关更详细的说明,请查看我的另一个答案.简而言之,在使用RMI时要小心链接异常.