我們使用Kryonet通過RMI調用服務器方法。 如果服務返回正常值(如true/false),它工作正常。Kryonet RMI拋出異常=>循環(StackOverflowError)
但是,當服務拋出異常,我們得到一個無限循環導致服務器上的StackOverflowError。
Exception in thread "Server" java.lang.StackOverflowError
at com.esotericsoftware.kryo.Kryo.getRegistration(Kryo.java:472)
at com.esotericsoftware.kryo.util.DefaultClassResolver.writeClass(DefaultClassResolver.java:97)
at com.esotericsoftware.kryo.Kryo.writeClass(Kryo.java:517)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:76)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:552)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:80)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:552)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:80)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518)
服務:
public class AuthServiceImpl extends BaseServiceImpl implements AuthService {
public boolean checkLogin(String username, String password) throws Exception {
// ...
throw new Exception("Test");
}
}
呼叫客戶端:
Boolean state = null;
try {
state = service.checkLogin("Test", "password");
} catch (Exception e) {
// Login Faild
// ...
}
return state;
所有類都註冊在KRYO。
- 服務
- 例外
- 類型
不能Kryonet處理超過RMI異常?
'拋出Exception'並不是很有想象力。你應該定義一個特殊的'LoginException'或者這個接口拋出的東西,然後拋出它。 – EJP
當然,我只是簡化它的帖子。 –