JavaFX NoSuchMethodException

Soloeco

Aktives Mitglied
Hi, derzeit erstelle ich ein Programm mit JavaFX/FXML und arbeite mit dem MVC Modell. Nun habe ich folgende Exception, beim Starten des Programmes:

Code:
javafx.fxml.LoadException:
/C:/Users/User/Desktop/Projekt_MM/MM_200819-0331/bin/view/View.fxml:12

    at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
    at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:941)
    at javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:980)
    at javafx.fxml/javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:227)
    at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:752)
    at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2722)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3237)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3194)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3163)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3136)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3113)
    at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3106)
    at view.View.generateGUI(View.java:31)
    at view.View.<init>(View.java:23)
    at control.Controller.<init>(Controller.java:22)
    at application.Main.start(Main.java:22)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: java.lang.InstantiationException: control.Controller
    at java.base/java.lang.Class.newInstance(Class.java:584)
    at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:936)
    ... 25 more
Caused by: java.lang.NoSuchMethodException: control.Controller.<init>()
    at java.base/java.lang.Class.getConstructor0(Class.java:3354)
    at java.base/java.lang.Class.newInstance(Class.java:571)
    ... 26 more

Den Controller habe ich in der FXML hinterlegt. Das Problem ist, dass ich im Konstruktor ein Attribut übergeben MUSS, was aber eben nicht sein darf und somit zu diesem Fehler führt.
Wie kann ich das beheben/umgehen?

(In meiner Main.java nutze ich die start Methode von JavaFX, die als Parameter eine Stage benötigt und diese Stage übergebe ich dann über den Controller an das View. Ist dies vielleicht anders umsetzbar?)

Freundliche Grüße!
 
Zuletzt bearbeitet:

Robat

Top Contributor
Du musst die Controller Factory des FXMLLoader überschreiben und dort per Hand eine neue Instanz deines Controllers erzeugen
 

Soloeco

Aktives Mitglied
Leider stehe ich noch etwas auf dem Schlauch. In welcher Klasse ist dies umzusetzen? In der Main, wo sich die start-Methode befindet?
 

Robat

Top Contributor
Du musst das dort machen, wo du die FXML Datei über den FXMLLoader lädst. Kleines Beispiel:
Java:
public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource("/fxml/root.fxml"));
        loader.setControllerFactory(e -> new Controller(this));

        HBox root = loader.load();

        primaryStage.setScene(new Scene(root, 200, 200));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Java:
public class Controller implements Initializable {
    private final Main main;

    public Controller(Main main) {
        this.main = main;
        System.out.println("Main set...");
    }
}
 

Trjavnamen

Bekanntes Mitglied
der Fehler ist im FXML Dokument in zeile 12 zu finden. Suche dort nach dem gelb unterstrichnen Teil (auf weißen Grund schwer zu sehen). Meist ist es die fxId; die sich mit der vergebenen @FXML private Listview XXX in deiner Klasse nicht decken oder wenn eingerichtet Acktion Event xxx im SceneBuilder sich nicht mit dem Public void xxx(){}in der KLasse deckt oder ganz fehlen. Halte dabei im FXML nach weiteren Fehlern ausschau die gelben Dreiecke am Anfang neben der Zeilennummer zeigen die Zeile mit den Fehlern!!
 

mrBrown

Super-Moderator
Mitarbeiter
der Fehler ist im FXML Dokument in zeile 12 zu finden. Suche dort nach dem gelb unterstrichnen Teil (auf weißen Grund schwer zu sehen). Meist ist es die fxId; die sich mit der vergebenen @FXML private Listview XXX in deiner Klasse nicht decken oder wenn eingerichtet Acktion Event xxx im SceneBuilder sich nicht mit dem Public void xxx(){}in der KLasse deckt oder ganz fehlen. Halte dabei im FXML nach weiteren Fehlern ausschau die gelben Dreiecke am Anfang neben der Zeilennummer zeigen die Zeile mit den Fehlern!!
Der Grund für den Fehler findet sich im StackTrace, wie schon vom TO selbst gesehen ist das der fehlende Parameterlose Konstruktor.
Da zu empfehlen, in der fxml nach Fehlermeldungen der IDE zu suchen ist imo ziemlicher Unsinn..
 

Trjavnamen

Bekanntes Mitglied
Du meinst damit die Zeile
Code:
 loader.setLocation(getClass().getResource("/fxml/root.fxml"));
dann löschen bis zur leeren Klammer und neu ".getClass und entsprechender Vorschläge neu bilden?
Verstehe ich das richtig?
 

mrBrown

Super-Moderator
Mitarbeiter
Du meinst damit die Zeile
Code:
 loader.setLocation(getClass().getResource("/fxml/root.fxml"));
dann löschen bis zur leeren Klammer und neu ".getClass und entsprechender Vorschläge neu bilden?
Verstehe ich das richtig?
Wie kommst du auf sowas? o_O

Der Fehler steht im Stacktrace: der Controller hat keinen Parameterlosen Konstruktor.
Die Lösung hat @Robat auch schon genannt: Controller nicht „durch JavaFX“ instanziieren lassen, sondern eine eigene ControllerFactory setzen und damit den Controller selbst instanzieren.
 

Neue Themen


Oben