Uitzondering in toepassingsstartmethode Java.lang.reflect.invocationTargetException

Ik begin net met Javafx, en ik probeer een eenvoudige applicatie te bouwen met een label, tekstveld en -knop die, wanneer opklikt, de waarde van het label instelt aan dat van het tekstveld. Alles ging goed totdat ik de controller op het hoofdbestand heb aangesloten. Hier is mijn code:

main.java

package application;
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
public class Main extends Application {
    private Stage primaryStage;
    @Override
    public void start(Stage primaryStage) {
        this.primaryStage = primaryStage; // connect primary stage
        mainWindow();
    }
    // main window
    public void mainWindow() {
        try {
            // view
            FXMLLoader loader = new FXMLLoader(Main.class.getResource("/MainWindowView.fxml"));
            AnchorPane pane = loader.load();
            // controller
            MainWindowController mainWindowController = loader.getController();
            mainWindowController.setMain(this);
            // scene on stage
            Scene scene = new Scene(pane);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        launch(args);
    }
}

mainwindowView.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.MainWindowController">
   <children>
      <Label fx:id="label" alignment="CENTER" layoutX="291.0" layoutY="164.0" text="Label" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0">
         <font>
            <Font size="20.0" />
         </font>
      </Label>
      <HBox alignment="CENTER" layoutX="201.0" layoutY="208.0" spacing="20.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0">
         <children>
            <TextField fx:id="field" layoutX="201.0" layoutY="208.0" />
            <Button layoutX="381.0" layoutY="208.0" mnemonicParsing="false" onAction="#handleButton" text="Change Text" />
         </children>
      </HBox>
   </children>
</AnchorPane>

mainwindowcontroller.java

package application;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
public class MainWindowController {
    // views
    @FXML private Label label;
    @FXML private TextField field;
    private Main main;
    // connect main class to controller
    public void setMain(Main main) {
        this.main = main; 
    }
    // assign text field text to label on button click
    public void handleButton() {
        String text = field.getText();
        label.setText(text);
        field.clear();
    }
}

Ik heb meerdere antwoorden geprobeerd gevonden op Stackoverflow, maar alles wat ik heb gevonden, waren van 2 jaar geleden en geen positief effect op mijn code.

EDIT: Stack trace hier:

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$155(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalStateException: Location is not set.
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2434)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
    at application.Main.mainWindow(Main.java:27)
    at application.Main.start(Main.java:19)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$175(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Exception running application application.Main

Antwoord 1, autoriteit 100%

Voor iedereen die in de toekomst exact hetzelfde probleem heeft, zoals James_D en de andere bijdragers aan het antwoord al zeiden, het verwijderen van de “/” aan het begin van het pad lost het probleem op, dus gebruik

FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindowView.fxml"));

in plaats van

FXMLLoader loader = new FXMLLoader(Main.class.getResource("/MainWindowView.fxml"));

Antwoord 2, autoriteit 29%

Dit probleem kan ook optreden, zelfs als het pad helemaal goed is.

  1. Wanneer u maakthet fxml-bestand in een bijgewerkte IDE.

  2. Gebruik vervolgens een oudere JavaFX Scene Builderom het te ontwerp.

Oplossing:

  1. Maakhet fxml-bestand in JavaFX Scane Builder

  2. Ontwerphet fxml-bestand in JavaFX Scane Builder en kopieer dit vervolgens naar de IDE of het Project.


Antwoord 3, autoriteit 14%

denk dat het dit is?

@FXML
void handleButton(ActionEvent event) {

Antwoord 4, autoriteit 7%

Ik heb deze casus ook ontmoet, volg mij alstublieft, ik hoop dat het lukt: Tool> Opties> Java> JavaFX> Scène Bouwer Home> Wijzig koppeling.
Je route naar Scenne Buider is ongeschikt, het kostte me uren om te vinden, het is tijdrovend, maar het zal altijd belangrijk zijn bij het starten van JavaFX.


Antwoord 5, autoriteit 7%

Voer de volgende handeling uit

FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindowView.fxml"));
Parent root =  loader.load();

Verwijder / van voor de .fxml-bestandsnaam.
Ik denk dat het zou moeten werken.
Het loste dezelfde fout voor mij op.


Antwoord 6

Locatie is niet ingesteld.
Deze uitzondering stelt dat uw FXML-bestand onbereikbaar is voor de code.
Als je je fxml-bestand in een pakket hebt, geef het dan op met de pakketnaam.


Antwoord 7

ik heb hetzelfde probleem gehad met het JUISTE PAD ik werkte in scene builder 8.5 ik heb het geüpgraded naar 11.0 en nu werkt het (ik heb de hele GUI opnieuw ontworpen).


Antwoord 8

Een andere oorzaak kunnen ontbrekende VM-opties zijn:

--module-path <path-to-javafx>/javafx-sdk-11.0.2/lib 
--add-modules=javafx.controls,javafx.fxml

Antwoord 9

Ik heb hetzelfde probleem gehad. Het komt door de maven bibliotheek. Ik heb een andere versie van de jfoenix-bibliotheek in scene builder jfoenix:0.1.8 en in IDE jfoenix:9.0.9.dus ik heb in beide dezelfde versie gedownload en het werkte voor mij.

En ook voor de nullpointer-uitzondering werkte deze code voor mij:

FXMLLoader fxmlLoader=new FXMLLoader (Main.class.getResource ("sample.fxml"));
Parent root =fxmlLoader.load ();

Het fxml-bestand en Mainzitten in hetzelfde pakket.


Antwoord 10

Ik heb deze thread en de antwoorden doorgelezen, maar de gevallen zijn een beetje anders voor mij

de code geschreven in het hoofdbestand is niet zoals vermeld als volgt:

FXMLLoader loader = new FXMLLoader(Main.class.getResource("MainWindowView.fxml"));

de code is in mijn geval als volgt:

FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));

en ik kwam dezelfde fout tegen (ongeveer)


Antwoord 11

Reageren op een opmerking van dat is gewoon verkeerd .. – kleopatra
May lijkt zo voor jou, maar met dezelfde uitzondering in de startmethode van de toepassing java.lang.reflect.InvocationTargetException met .getResource (fxml + “.fxml”) als een trigger onder de JavaFx8-versie, die het probleem voor mij oplost en het is de oplossing , dus uw opmerking die duidelijk verkeerd is, is persoonlijk om u te geven en niet algemeen. Voor sommigen is het gewoon de oplossing die ze nodig hebben.


Antwoord 12

Dat is om .getResource()te vervangen door Bestandsklasse die dezelfde URL retourneert en het probleem is opgelost. U hoeft zich geen zorgen te maken over het toevoegen van / aan het bestandspad of het gebruik van een relatief of absoluut bestandspad, zolang het bestandspad geldig is – controleer f.exist om zeker te zijn. Ik heb gepost wat ik heb geprobeerd en opgelost na het volgen van alle mogelijke thread-antwoorden hier op dit platform zonder geldig resultaat. Deze code hieronder loste het probleem voor mij op, dus als het voor jou duidelijk verkeerd is, zoals eerder opgemerkt -kleopatra, is dat OK. Het is niets voor mij.

try { 
    File f = New File("");URL myfile = new File(f.getAbsolutePath()).toURL(); scene.getStylesheets().add(myfile.toExternalForm()); 
    } catch(Exception e) {
}

Antwoord 13

.getRESOURCE (“mainwindowview.fxml”)); en .getRESOURCE (FXML + “.FXML”));

is het probleem, bekend om nullpointer en ander bestand te verhogen, zelfs niet is gevonden, zelfs als het bestandspad perfect geldig is, ontdoen door de bestandsklasse te gebruiken die dezelfde URL-waarde retourneert zoals eerder vermeld en uw code moet werken.

Other episodes