Получает ошибку в Java и не понимает проблему: Исключение в методе инициализации приложения java .lang.reflect.InvocationTargetException - PullRequest
0 голосов
/ 09 апреля 2020

Я занимаюсь разработкой программы с использованием JavaFX и не вижу ошибок в своем коде (не подчеркнуто), но когда я запускаю код с использованием отдельного файла, я получаю следующую ошибку:

Вот полная трассировка стека:

Exception in Application init method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    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(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application init method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:912)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$1(LauncherImpl.java:182)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: Children: duplicate children added: parent = Grid hgap=0.0, vgap=0.0, alignment=TOP_LEFT
    at javafx.scene.Parent$2.onProposedChange(Parent.java:454)
    at com.sun.javafx.collections.VetoableListDecorator.add(VetoableListDecorator.java:206)
    at website.CreateAccountPane.<init>(CreateAccountPane.java:60)
    at website.WebsiteRootPane.<init>(WebsiteRootPane.java:22)
    at main.ApplicationLoader.init(ApplicationLoader.java:14)
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:841)
    ... 2 more
Exception running application main.ApplicationLoader

Это код для моего приложения запуска:

package main;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import website.WebsiteRootPane;

public class ApplicationLoader extends Application {

    private WebsiteRootPane root;

    @Override
    public void init() {
        root = new WebsiteRootPane();
    }

    @Override
    public void start(Stage stage) throws Exception {
        stage.setMinWidth(1000);
        stage.setMinHeight(750);
        stage.setTitle("Planet Generator");
        stage.setScene(new Scene(root));
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

Это одна из панелей вкладок для моего сайта, пока она единственная Я построил.


package website;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

import javafx.geometry.Insets;

import javafx.geometry.Pos;

import javafx.scene.control.Button;

import javafx.scene.control.ComboBox;

import javafx.scene.control.Label;

import javafx.scene.control.PasswordField;

import javafx.scene.control.TextField;

import javafx.scene.layout.GridPane;


public class CreateAccountPane extends GridPane {

    private ComboBox<String> cboTitle;
    private TextField txtSurname, txtFirstName, txtEmail;
    private Button btnCreate;
    private PasswordField pwrd;

    public CreateAccountPane() {


        //create labels
        Label lblTitle = new Label("Title");
        Label lblFirstName = new Label("First name");
        Label lblSurname = new Label("Surname");
        Label lblEmail = new Label("Email");
        Label lblPassword = new Label("Password");

        // setup combobox
        ObservableList<String> titles = FXCollections.observableArrayList("Mr", "Mrs", "Miss", "Ms");
        cboTitle = new ComboBox<String>(titles);
        cboTitle.getSelectionModel().select(0);

        // setup text fields
        txtFirstName = new TextField();
        txtSurname = new TextField();
        txtEmail = new TextField();
        pwrd = new PasswordField();

        this.add(lblTitle, 0, 0);
        this.add(cboTitle, 1, 0);

        this.add(lblFirstName, 0, 1);

        this.add(txtFirstName, 1, 1);

        this.add(lblSurname, 0, 2);
        this.add(txtSurname, 1, 2);

        this.add(lblEmail, 0, 3);
        this.add(txtEmail, 1, 3);

        this.add(lblPassword, 0, 4);
        this.add(pwrd, 1, 4);

        this.getChildren().add(txtFirstName);       
    }
}

1 Ответ

3 голосов
/ 09 апреля 2020

Проблема

Вы добавляете txtFirstName дважды, но вы можете добавить элемент в пользовательский интерфейс только один раз.

Вы добавляете его с помощью

this.add(txtFirstName, 1, 1);

и

this.getChildren().add(txtFirstName);

Вы можете исправить это, удалив

this.getChildren().add(txtFirstName);

Как это найти (прочитайте это, это поможет вам:))

Посмотрите на ваше исключение:

Исключение в методе инициализации приложения java .lang.reflect.InvocationTargetException

Это говорит о том, что проблема возникает при выполнении кода init.

InvokedTargetException означает, что метод, вызванный с использованием отражения (как в случае с init, поскольку JavaFX использует отражение для этого), выдал исключение. Это может быть любое исключение. Раздел Caused by в трассировке стека показывает реальное исключение. Давайте посмотрим на это:

Причина: java .lang.IllegalArgumentException: Дети: добавлены дубликаты детей: parent = Grid hgap = 0.0, vgap = 0.0, выравнивание = TOP_LEFT в javafx.scene. Родительский $ 2.onProposedChange (Parent. java: 454) на com.sun.javafx.collections.VetoableListDecorator.add (VetoableListDecorator. java: 206) на веб-сайте. CreateAccountPane. (CreateAccountPane. java: 60) *

Сообщение об исключении (Children: duplicate children added: parent = Grid hgap=0.0, vgap=0.0, alignment=TOP_LEFT) говорит вам, что проблема в том, что вы уже добавили этот элемент.

на веб-сайте website.CreateAccountPane. (CreateAccountPane. java: 60)

сообщает, что это произошло в строке 60 из CreateAccountPane (CreateAccountPane.java:60).

Далее, мы посмотрим на эту строку ближе:

this.getChildren().add(txtFirstName);

Он фактически добавляет элемент на панель сетки.

Итак, кажется, что этот элемент уже является частью панели сетки. Итак, давайте посмотрим, что вы добавили к нему ранее:

this.add(txtFirstName, 1, 1);

Вы добавили один и тот же элемент два раза. В этом проблема.


Заключение

Как видите, чтение и интерпретация трассировки стека является очень и очень важной частью программирования. Если вы включите go, вы увидите все больше и больше таких трассировок стека.

Не бойтесь этих огромных красных текстов. Разделите их на части и попытайтесь найти проблему.

Это может быть трудоемким и трудным делом, особенно в начале , но со временем вам станет лучше !

Поиск понимание и исправление ошибок - очень важная часть программирования (возможно, самая важная часть).

Эта часть будет намного проще, если вы сможете

  • читать и интерпретировать исключения

и

  • отладка. Если вы не знаете, что такое отладка, посмотрите, изучите и попробуйте. Это почти наверняка поможет вам.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...