Graphviz-java java.lang.NullPointerException-Problem

Das Problem ist nicht ganz trivial und ich muss das On-topic diskutieren.

Also erstmal ich hab mit Maven GitHub - nidi3/graphviz-java: Use graphviz with pure java eingebunden.

Dann verstehe ich nicht genau, wie sich Nodes und Graph zusammensetzt:

        Graph g = Factory.graph("Dateien").directed().generalAttr().with(RankDir.LEFT_TO_RIGHT).with(parent.no);
        Graphviz.fromGraph(g).width(900).render(Format.PNG).toFile(new File("dateien1.png"));

In der zweiten Zeile bekomme ich eine NPE:

Exception in thread "main" java.lang.NullPointerException
	at guru.nidi.graphviz.engine.Renderer.toFile(Renderer.java:44)
	at obige Zeile...

Vielleicht erstmal, was ich vor hab:

Ab einem bestimmten Verzeichnis möchte ich das Verzeichnis und alle Unterverzeichnisse in einem Baum darstellen (so ähnlich wie im Explorer, nur halt ein „richtiger“ Baum):

//...
e.no = Factory.node(level + " " + index++).with(Records.of(ff.getName(), "" + ff.getSize(), "" + ff.getType()));
//...
parent.no.link(e.no);
//...

Verlinke ich etwas falsch?

Beim offiziellen Beispiel findet die Verlinkung schon bei der Initialisierung des Graph statt:

//...
Graph g = graph("example3").directed()
        .generalAttr().with(RankDir.LEFT_TO_RIGHT)
        .with(
                node0.link(
                        between(loc("f0"), node1.loc("v", SOUTH)),
                        between(loc("f1"), node2.loc(WEST)),
                        between(loc("f2"), node3.loc(WEST)),
                        between(loc("f3"), node4.loc(WEST)),
                        between(loc("f4"), node5.loc("v", NORTH))),
                node2.link(between(loc("p"), node6.loc(NORTH_WEST))),
                node4.link(between(loc("p"), node7.loc(SOUTH_WEST))));
Graphviz.fromGraph(g).width(900).render(Format.PNG).toFile(new File("example/ex3.png"));

(Ganz verstehe ich dieses wunderbare fluent-Interface auch nicht. :frowning: )

Weiß jemand, wo der Fehler sich befindet?

Bei der Zeile https://github.com/nidi3/graphviz-java/blob/master/src/main/java/guru/nidi/graphviz/engine/Renderer.java#L44 gibt’s nur eine Stelle, wo das herkommen kann, und entsprechend https://docs.oracle.com/javase/8/docs/api/java/io/File.html#getParentFile-- würde ich mal einen Pfad wie new File("C:/dateien1.png") versuchen.

Geil, das hat mit example/dateien1.png funktioniert. :smile:

D. h., ein Graph braucht ein eigenes Verzeichnis.

Das nächste Problem wäre, dass bei der Verlinkung noch etwas nicht funktioniert hat:

(Nur ein Node, keine Links :frowning: )

Ich kenn’ mich mit der Lib zwar nicht aus, aber das in deinem Code nirgendwo ein link vorkommt, ist so gesehen suspekt…

Bei genauerem Hinsehen kommt schon ein link vor, aber ich hab’s:

Folgendes funktioniert nicht:

        Node n1 = Factory.node("parent"),
                n2 = Factory.node(0 + " " + 0).with(Records.of("1", "2", "3")),
                n3 = Factory.node(1 + " " + 0).with(Records.of("4", "5", "6")),
                n4 = Factory.node(1 + " " + 1).with(Records.of("7", "8", "9"));

        n1.link(n2);
        n2.link(n3);
        n2.link(n4);

        Graph g = Factory.graph("Dateien").directed().generalAttr().with(RankDir.LEFT_TO_RIGHT).with(n1);
        Graphviz.fromGraph(g).width(400).render(Format.PNG).toFile(new File("example/dateien2.png"));

(Nur ein node).

Folgendes funktioniert:

        Node n1 = Factory.node("parent"),
                n2 = Factory.node(0 + " " + 0).with(Records.of("1", "2", "3")),
                n3 = Factory.node(1 + " " + 0).with(Records.of("4", "5", "6")),
                n4 = Factory.node(1 + " " + 1).with(Records.of("7", "8", "9"));

        n2 = n2.link(n3);
        n2 = n2.link(n4);
        n1 = n1.link(n2);

        Graph g = Factory.graph("Dateien").directed().generalAttr().with(RankDir.LEFT_TO_RIGHT).with(n1);
        Graphviz.fromGraph(g).width(400).render(Format.PNG).toFile(new File("example/dateien1.png"));

D. h., von rechts nach links, von oben nach unten. :frowning:

Also nochmal. Das Thema ist eigentlich schon mit Antwort #1 gelöst. Möchtest du eigentlich als Antwort ausgezeichnet werden, @Marco13 ?

Dann ist „das“ ja fluent, und so ziemlich das krasseste fluent, welches ich i-wo gesehen hab.

Soll heißen, Nodes Graphs usw. besitzen keinen veränderbaren Zustand.

Nun geb’ ich aber nicht den Graph per Hand ein… Sondern der wird entlang der Dateien und Verzeichnisse… eh… „programmatisch“…??? erzeugt. (algorithmisch, automatisch, nicht-manuell… Häh?)

LL L R RR Wurzel (oder L LR RL R Wurzel), wenn man so möchte.


Außerdem dann noch ist ein Graph nicht geeignet, ein Dateisystem zu zeichnen, das zeigt sich so:


:confused:

Das “Auszeichnen” ist keine “Auszeichnung”, sondern lediglich ein Hinweis darauf, dass man ggf. schnell sieht, ob das Problem gelöst ist, und wenn ja, wo. Wenn in einem Thread mehrere Probleme besprochen werden, macht das nicht unbedingt Sinn.

Das fluent ist doch eigentlich nicht schlimm. Überall, wo man ansonsten node.addLink(x) schreiben würde, schreibt man dann halt sowas wie nodeBuilder.link(x). Dass man am Ende nochmal ein nodeBuilder.nowAssembleThisStuffIntoAGraph() schreiben muss, sollte nicht sooo schlimm sein.