2014-01-14 58 views
-1

我在我正在使用的代碼庫上遇到錯誤。某些值不是從一個過程傳遞到另一個過程。經過多次挫折之後,我將罪魁禍首縮小到一個單一的RMI電話。客戶端進程會打電話從服務器中檢索一些數據。該方法返回某個類的ArrayList。調試表明服務器正確運行該方法,但客戶端從不重新獲得控制權。客戶端只是掛起。挖掘下來,我意識到客戶需要的類不執行Serializable。改變這個問題解決了問題。 Java版本是1.6。當我的代碼嘗試通過RMI發送一個反序列化的對象時,如何引發異常?

public interface RMIServer extends Remote{ 
    public ArrayList<MyObject> getObjects() throws RemoteException; 
} 

public class MyRMIServer implements RMIServer{ 
    public ArrayList<MyObject> getObjects() throws RemoteException{ 
     //All of the following code is called 
     ArrayList<MyObject> objects = new ArrayList<MyObject>(); 
     objects.add(new MyObject()); 
     objects.add(new MyObject()); 
     objects.add(new MyObject()); 
     return objects; 
    } 
} 

public class RMIClient{ 
    public static void main(String args[]){ 
     RMIServer rmiServer = (RMIServer)Namespace.lookup("localhost/rmiServer"); 
     ArrayList<MyObject> listOfObjects = rmiServer.getObjects(); 
     System.out.println("This is never called"); 
    } 
} 

我的問題是,有沒有什麼辦法可以導致客戶端或服務器在發生這種情況時拋出異常?

回答

0

我的問題是,有什麼辦法可以導致客戶端或服務器在發生這種情況時拋出異常嗎?

它確實會拋出異常。 NotSerializableException。在這種情況下,客戶端將收到它封裝在ServerException中。你的客戶端代碼不能編譯,所以你聲稱不會拋出異常,客戶端永遠不會重新獲得控制權。

+0

當然,你從不想用bug來部署,但如果發生錯誤,你確實需要一種乾淨的方式來處理它。這似乎有點愚蠢。 – Yserbius

0

我不知道如果我明白你的問題,但如果你想拋出一個異常,你可以使用:

throw new YourCustomException(); 

或者,如果有必要,你可以趕上一個嘗試捕捉異常,但當然你應該只做這件事來處理你知道的異常,比如用戶輸入錯誤的數據,並且如果發生這種情況,你想告訴用戶它是錯誤的。

但請確保您可以修復的錯誤是像序列化應該序列化的對象一樣修復的。這些是通過網絡傳輸的對象。

+0

這不是我正在尋找的。我想要一種方式在發生特定的幾乎不可檢測的異常時拋出異常。 – Yserbius

+0

那麼,你說它幾乎無法檢測,所以他們是一種知道異常發生的方式。在這個時候,你必須拋出你自己的異常,或者捕獲你正在談論的這個異常。 – Digihash

相關問題