我知道我们必须使用以下签名定义方法来覆盖默认的序列化过程:
private void writeObject(ObjectOutputStream os) {
}
private void readObject(ObjectInputStream is) {
}
上述方法可以抛出的异常类型是否有任何限制?我知道方法抛出的异常不是方法签名的一部分,而是想确认。
答案 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;
这是调用write方法的地方:
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。
我假设read方法被类似地调用,你可能想要自己检查它。
答案 1 :(得分:0)
您可以在两种方法中抛出任何RuntimeException
在writeObject(ObjectOutputStream out)中,您也可以抛出IOException
在readObject(ObjectInputStream in)中,yu也可以抛出IOException
和ClassNotFoundException