马绍尔群岛共和国和例外情况

2022-09-02 21:31:46

我是使用RMI的新手,而我对使用异常相对较新。

我希望能够在RMI上引发异常(这可能吗?

我有一个简单的服务器,它为学生提供服务,我有删除方法,如果学生不存在,我想抛出一个扩展RemoteException的StudentNotFoundException的自定义例外(这是一件好事吗?

任何建议或指导将不胜感激。

服务器接口方法

    /**
 * 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());
    }

}

学生不成立异常

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是个坏主意。


答案 1

可以抛出任何类型的异常(甚至是自定义的),只需确保将它们打包在导出.jar文件中(如果您使用的是需要手动执行此操作的Java版本)。

不过,我不会对 RemoteException 进行子类化。如果存在某种连接问题,通常会抛出这些。据推测,您的客户端处理连接问题的方式与其他类型的问题不同。当您捕获 RemoteException 或连接到其他服务器时,您可以告诉用户服务器已关闭。对于 StudentNotFoundException,您可能希望再给用户一次输入学生信息的机会。


答案 2

是的,可以通过 RMI 引发异常。

不,扩展以报告应用程序故障不是一个好主意。 表示远程处理机制中的故障,如网络故障。使用适当的例外,必要时扩展自己。RemoteExceptionRemoteExceptionjava.lang.Exception

有关更详细的解释,请查看我的另一个答案。简而言之,在使用 RMI 时,请注意链接异常。


推荐