2009-03-04 12 views
16

RMIを初めて使用していて、例外を使用するのが比較的新しいです。RMIと例外

私は(これは可能ですか?)RMI上の例外をスローすることができるようにしたい

私は、学生を提供単純なサーバーを持っていると私は、学生が存在しない場合、私がしたいdeleteメソッドを持っています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()); 
    } 

} 

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の拡張が悪い考えであることに気付きました。

答えて

11

例外をスローすることは可能です(カスタムのものも含めて)。エクスポートする.jarファイルにパッケージ化するようにしてください(手動で行う必要があるJavaのバージョンを使用している場合)。

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

2

RemoteExceptionを拡張する例外はありません。

(それは具体的な例外の種類は、サーバーとクライアントの両方で使用されるコードベースであることの必要性を投げていることは注目に値します。)

5

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

いいえ、RemoteExceptionを拡張してアプリケーションの失敗を報告することはお勧めできません。 RemoteExceptionは、ネットワーク障害のようなリモート処理メカニズムの障害を通知します。必要に応じてjava.lang.Exceptionまでご連絡ください。

さらに詳しい説明はlook at another of my answersです。簡単に言えば、RMIを使用する際には、連鎖例外について注意してください。

+0

こんにちは、その質問はおなじみです! –

+0

私は実際に転記する前にこれを見ました。助言のための乾杯 - 私は今解決した問題を持っていると思います – Malachi

2

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

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

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

私はそれを例外的に個人的に拡張します。あなたの例外はあなたの例外です。RemoteExceptionsは、接続上の理由からRMIに間違っているもののためのものです。

+0

コンパイラは、最も特定の例外を最初にキャッチする必要があります。あなたの例はコンパイルされません。それ以外の場合は、良い投稿。 –

+0

それを手に入れてください。私はそれを知っていた! – banjollity