18

私は RMI を初めて使用し、例外を使用するのは比較的初めてです。

RMI 経由で例外をスローできるようにしたい (これは可能ですか?)

学生にサービスを提供する単純なサーバーがあり、学生が存在しない場合は、RemoteException を拡張する StudentNotFoundException のカスタム例外をスローする delete メソッドがあります (これは良いことですか?)

アドバイスやガイダンスをいただければ幸いです。

サーバーインターフェース方式

    /**
 * 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 を拡張することは悪い考えであることに気付きました。

4

4 に答える 4

12

任意の種類の例外 (カスタムのものを含む) をスローしてもかまいません。エクスポート .jar ファイルに必ずパッケージ化してください (これを手動で行う必要があるバージョンの Java を使用している場合)。

ただし、RemoteException をサブクラス化するつもりはありません。これらは通常、何らかの接続の問題がある場合にスローされます。おそらく、クライアントは接続の問題を他のタイプの問題とは異なる方法で処理します。RemoteException をキャッチしたとき、または別のサーバーに接続したときに、サーバーがダウンしていることをユーザーに伝えることができます。StudentNotFoundException の場合、ユーザーに学生情報を入力する機会をもう一度与えたいと思うでしょう。

于 2009-03-04T21:35:26.037 に答える
6

はい、RMI 経由で例外をスローすることは可能です。

RemoteExceptionいいえ、アプリケーションの障害を報告するように拡張することはお勧めできません。RemoteExceptionネットワーク障害など、リモーティング メカニズムの障害を通知します。適切な例外を使用し、必要に応じて自分自身を拡張しjava.lang.Exceptionてください。

より詳細な説明については、別の回答をご覧ください。一言で言えば、RMI を使用する場合は、例外の連鎖に注意してください。

于 2009-03-04T21:36:58.200 に答える
3

RMI 経由で例外をスローできるようにしたい (これは可能ですか?)

はい。例外であっても、何でもシリアル化できます。Exception自体はSerializableを実装していると思います。

学生にサービスを提供する単純なサーバーがあり、学生が存在しない場合は、RemoteException を拡張する StudentNotFoundException のカスタム例外をスローする delete メソッドがあります (これは良いことですか?)

個人的に例外を拡張してもらいます。あなたの例外はあなたの例外であり、RemoteExceptions は接続上の理由で RMI に問題が発生した場合のものです。

于 2009-03-04T21:37:53.550 に答える
2

例外を延長する必要はありませんRemoteException

(スローされる具体的な例外タイプは、サーバーとクライアントの両方で使用されるコードベースにある必要があることに注意してください。)

于 2009-03-04T21:36:04.473 に答える