Из-за ошибки я предполагаю, что вы используете JavaFX 11 (или, по крайней мере, JavaFX 9+). Обратите внимание, что основной проблемой является не InvocationTargetException
, а IllegalAccessError
:
Caused by: java.lang.IllegalAccessError: superclass access check failed: class com.sun.javafx.scene.control.ControlHelper (in unnamed module @0x46b3f4cf) cannot access class com.sun.javafx.scene.layout.RegionHelper (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.scene.layout to unnamed module @0x46b3f4cf
Это говорит о том, что код в «неназванном модуле» пытается получить доступ к внутренним компонентам модуля javafx.graphics
. Так как это не разрешено, выдается ошибка. Но настоящая проблема здесь в том, что ControlHelper
находится в безымянном модуле, но предполагается, что находится в модуле javafx.controls
, если имя пакета является чем-то, что нужно пройти. Эта проблема вызвана наличием javafx.graphics
на modulepath , но javafx.controls
на classpath .
Убедитесь, что на --module-path
установлены оба модуля (и javafx.base
). Поскольку ваш код не является модульным (нет файла module-info
), вам также придется указать системе модулей разрешить его, используя:
--add-modules javafx.controls
Вам не нужно включать javafx.graphics
в команду --add-modules
, потому что javafx.controls
требует javafx.graphics
(а javafx.graphics
требует javafx.base
). Поскольку все модули находятся на пути модуля, они будут разрешены.
То, как вы устанавливаете эти команды, зависит от того, как вы запускаете приложение (например, из командной строки, IDE, Maven, Gradle и т. Д.).
Если вы когда-нибудь сделаете свой код модульным, вам не нужно будет использовать команду --add-modules
, просто поместите соответствующие директивы requires
в ваш файл module-info
. Например:
module app {
requires javafx.controls;
}