質問
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を拡張するのは悪い考えであることに気付きました。
解決
任意の種類の例外(カスタムの例外も含む)をスローしても構いません(エクスポートの.jarファイルにパッケージ化してください(手動でこれを行う必要があるJavaのバージョンを使用している場合)。
ただし、RemoteExceptionをサブクラス化しません。通常、何らかの接続の問題がある場合にスローされます。おそらく、クライアントは接続の問題を他のタイプの問題とは異なる方法で処理します。 RemoteExceptionをキャッチするか、別のサーバーに接続すると、サーバーがダウンしていることをユーザーに伝えることができます。 StudentNotFoundExceptionの場合、おそらくユーザーに学生情報を入力する機会をもう一度与えたいと思うでしょう。
他のヒント
はい、RMIを介して例外をスローすることは可能です。
いいえ、 RemoteException
を拡張してアプリケーションの障害を報告することはお勧めできません。 RemoteException
は、ネットワーク障害などのリモート処理メカニズムの障害を通知します。適切な例外を使用し、必要に応じて java.lang.Exception
を自分で拡張します。
より詳細な説明については、別の回答。一言で言えば、RMIを使用する場合は例外の連鎖に注意してください。
RMIで例外をスローできるようにしたい(これは可能ですか?)
はい。例外を含め、何でもシリアル化できます。例外自体はSerializableを実装していると思います。
学生にサービスを提供する単純なサーバーがあり、学生が存在しない場合にRemoteExceptionを拡張するStudentNotFoundExceptionのカスタム例外をスローするdeleteメソッドがあります(これは良いことですか?)
個人的に例外を拡張します。例外は例外であり、RemoteExceptionsは接続上の理由でRMIで問題が発生した場合のものです。
例外は RemoteException
を拡張する必要はありません。
(スローされる具体的な例外タイプは、サーバーとクライアントの両方で使用されるコードベースにある必要があることに注意してください。)