所以我再一次在java中玩游戏,在这样做时,我遇到了一个有趣的问题。
我试图给自己写一点注册服务。如果某个类型的对象通过其构造函数实例化,它将从我的注册服务中检索一个id并添加到对象的服务列表中。
这是一个示例对象
public class Test {
private final Long id;
public Test() {
this.id = TestRegistration.register(this);
throw new IllegalAccessError();
}
public Long getId() {
return this.id;
}
}
这是一个示例服务
public class TestRegistration {
private final static Map<Long, Test> registration = new HashMap<>();
protected final static long register(final Test pTest) {
if (pTest.getId() != null) {
throw new IllegalStateException();
}
long freeId = 0;
while (registration.containsKey(freeId)) {
freeId = freeId + 1;
}
registration.put(freeId, pTest);
return freeId;
}
protected final static Test get(final long pId) {
return registration.get(pId);
}
}
现在您可以看到,我的班级Test
的构造函数根本无法成功执行,因为它始终会抛出IllegalAccessError
。但是在抛出此错误之前,在构造函数中调用register(...)
类的方法TestRegistration
。在此方法中,它会添加到注册Map
中。所以如果我想运行这个代码
public static void main(final String[] args) {
try {
final Test t = new Test();
} catch (final IllegalAccessError e) {
}
final Test t2 = TestRegistration.get(0);
System.out.println(t2);
}
我的TestRegistration
确实包含了我的Test
类的构造函数被调用时创建的对象,我可以(这里使用变量t2
)访问它,即使它不是&# 39; t首先成功创建。
我的问题是,我可以以某种方式从我的TestRegistration类中检测Test的构造函数是否成功执行而没有任何异常或其他中断?
在你问我为什么抛出这个例外之前,这是我的答案。测试可能有潜在的子类我还不知道,但仍会在我的TestRegistration类中注册。但由于我不会对这些子类的结构产生影响,我无法判断它们的构造函数是否会抛出异常。
答案 0 :(得分:0)
天气与否构造函数comples不会影响对象是否被创建。将创建所有实例变量,仍将调用super()并仍将分配内存。
实际上,将始终抛出异常,注册服务中的每个对象都会抛出异常。由于孩子必须调用super()才能进行注册,并且在注册后会抛出异常。