ノードのツリーを作成し、それをオブジェクト指向データベース (db4o) に格納します。データベースからノードを効率的にロードしたいので、Transparent Activation を使用し、Activatable インターフェイスを実装します。私のノードクラスは次のとおりです。
package directory_service_server;
import com.db4o.activation.ActivationPurpose;
import com.db4o.activation.Activator;
import com.db4o.ta.Activatable;
import java.util.ArrayList;
public class Node implements Activatable{
private String name;
private String attribute;
private ArrayList<Node> children;
private transient Activator _activator;
//Node father;
public Node()
{
this.name="";
this.attribute="";
this.children= new ArrayList<Node>();
// this.father= new Node ();
}
public Node(String name, String attribute, ArrayList<Node> children)
{
this.name=name;
this.attribute=attribute;
this.children=children;
}
void setName(String name)
{
this.name=name;
}
void setAttribute(String attribute)
{
this.attribute=attribute;
}
void setChildren(ArrayList<Node> children)
{
this.children=children;
}
String getName()
{
this.activate(ActivationPurpose.READ);
return name;
}
String getAttribute()
{
this.activate(ActivationPurpose.READ);
return this.attribute;
}
String getAttributeWithoutActivation()
{
return this.attribute;
}
ArrayList<Node> getChildren()
{
this.activate(ActivationPurpose.READ);
return children;
}
@Override
public void activate(ActivationPurpose purpose) {
if(_activator!=null)
_activator.activate(purpose);
}
@Override
public void bind(Activator activator) {
if(_activator==activator)
{
return;
}
if(activator!=null && _activator!=null )
{
throw new IllegalStateException();
}
_activator=activator;
}
}
データベースからルート (ノード) をロードし、グラフのトラバースを開始すると、トラバース メソッド (ノード値も出力されます) は次のようになります。
void displayTree(Node node)
{
System.out.print(node.getName()+"-");
for(int i=0; i<node.getChildren().size(); i++)
displayTree(node.getChildren().get(i));
}
私を混乱させているのは、「いくつかのトラバーサル」の場合、トラバーサルを行うときにNull Exceptionが発生するかどうかを判断できないことです。上記のメソッドの次の行で例外が発生します。
for(int i=0; i<node.getChildren().size(); i++)
私の解釈では、ノードの子は NULL であるため、size() メソッドにアクセスすると NULL が返されます。Activatable クラスの実装に何かが欠けているのではないかと思います。実装には次のソースを使用しましたが、他のソースは見つかりませんでした。http://docs.huihoo.com/db4o/db4o-7.0-java-tutorial.pdf
誰かが私に欠けているものを教えてくれますか? 以下はスタック トレースの一部です。
ava.lang.NullPointerException
at directory_service_server.Tree.displayTree(Tree.java:88)
at directory_service_server.Tree.displayTree(Tree.java:89)
at directory_service_server.Tree.displayTree(Tree.java:89)
at directory_service_server.Tree.displayTree(Tree.java:89)
at directory_service_server.ClientHandler.registerService(ClientHandler.java:187)
at directory_service_server.ClientHandler.run(ClientHandler.java:59)
at java.lang.Thread.run(Thread.java:722)
com.db4o.events.EventException
at com.db4o.internal.events.EventRegistryImpl.withExceptionHandlingInCallback(EventRegistryImpl.java:283)
at com.db4o.internal.events.EventRegistryImpl.triggerObjectInfoEventInCallback(EventRegistryImpl.java:270)
at com.db4o.internal.events.EventRegistryImpl.objectOnNew(EventRegistryImpl.java:89)
at com.db4o.internal.ObjectReference.objectOnNew(ObjectReference.java:194)
at com.db4o.internal.ObjectReference.continueSet(ObjectReference.java:180)
at com.db4o.internal.ObjectContainerBase.stillToSet(ObjectContainerBase.java:1902)
at com.db4o.internal.ObjectContainerBase.store2(ObjectContainerBase.java:1698)
at com.db4o.internal.ObjectContainerBase.storeAfterReplication(ObjectContainerBase.java:1618)
at com.db4o.internal.ObjectContainerBase$10.apply(ObjectContainerBase.java:1604)
at com.db4o.internal.ObjectContainerBase$10.apply(ObjectContainerBase.java:1602)
at com.db4o.internal.ObjectContainerBase.asTopLevelCall(ObjectContainerBase.java:427)
at com.db4o.internal.ObjectContainerBase.asTopLevelStore(ObjectContainerBase.java:413)
at com.db4o.internal.ObjectContainerBase.storeInternal(ObjectContainerBase.java:1602)
at com.db4o.internal.marshall.MarshallingContext.writeObject(MarshallingContext.java:252)
at com.db4o.internal.OpenTypeHandler.writeObject(OpenTypeHandler.java:266)
at com.db4o.internal.OpenTypeHandler.write(OpenTypeHandler.java:251)
at com.db4o.internal.marshall.MarshallingContext.writeObjectWithCurrentState(MarshallingContext.java:272)
at com.db4o.internal.marshall.MarshallingContext.writeObject(MarshallingContext.java:260)
at com.db4o.typehandlers.CollectionTypeHandler.writeElements(CollectionTypeHandler.java:56)