2014-01-22 31 views
0

我知道,我們必須定義具有以下簽名覆蓋默認序列化過程的方法:允許實現readObject和writeObject方法來覆蓋java中的默認序列化的異常?

private void writeObject(ObjectOutputStream os) { 
} 

private void readObject(ObjectInputStream is) { 
} 

有沒有對可以通過上述方法拋出的異常類型的限制?我知道一個方法拋出的異常不是方法簽名的一部分,而是想確認。

+2

你從哪裏得到錯誤的印象,即「方法拋出的異常不是方法簽名的一部分」? –

+0

嗨,湯姆,我這樣說是因爲我們不能基於從方法拋出的檢查異常的類型重載方法,因此它不能是方法簽名的一部分。 –

+0

僅僅因爲你不能基於該方法重載不會使其不在簽名中。你不能基於返回類型進行重載,但當然這也是方法簽名的一部分。 –

回答

1

Serializable定義以下例外:

private void writeObject(java.io.ObjectOutputStream out) 
    throws IOException 
private void readObject(java.io.ObjectInputStream in) 
    throws IOException, ClassNotFoundException; 
private void readObjectNoData() 
    throws ObjectStreamException; 

這是寫入方法被調用:

 try { 
      writeObjectMethod.invoke(obj, new Object[]{ out }); 
     } catch (InvocationTargetException ex) { 
      Throwable th = ex.getTargetException(); 
      if (th instanceof IOException) { 
       throw (IOException) th; 
      } else { 
       throwMiscException(th); 
      } 
     } 

// ... 

private static void throwMiscException(Throwable th) throws IOException { 
    if (th instanceof RuntimeException) { 
     throw (RuntimeException) th; 
    } else if (th instanceof Error) { 
     throw (Error) th; 
    } else { 
     IOException ex = new IOException("unexpected exception type"); 
     ex.initCause(th); 
     throw ex; 
    } 
} 

正如你可以看到你可以拋出任何非運行時異常,它會被包裹在一個IOException,但你應該更喜歡因的IOExceptions較短的堆棧痕跡和更多有用的錯誤消息。

我假設讀取方法的調用方式相似,但您可能想自己檢查一下。

0

你可以拋出任何RuntimeException在這兩種方法

在的writeObject(ObjectOutputStream的出來),你也可以拋出IOException

在的readObject(ObjectInputStream中的)宇還可以拋出IOExceptionClassNotFoundException

相關問題