Подтвердить что ты не робот

JavaFX IllegalAccessException во время загрузки FXML()

У меня есть диалоговое окно, которое вызывается следующим кодом (DialogController является вспомогательным классом для использования модальных диалоговых окон, в основном объединяет ссылку контроллера со своим окном):

void handleServicesEdit(ActionEvent event) throws IOException {

    DCServRecEditor sre = DialogController.<DCServRecEditor>loadFXML(
            CensusAssistant.RES_FXML_DIALOG_SERVEDIT,
            CensusAssistant.RES_STRING_SERVEDIT,
            this.getDialog());
    sre.setDialogMode(DB.DBEDIT_MODE_EDIT,
                      tbvService.getItems(),
                      tbvService.getSelectionModel().getSelectedIndex(),
                      m_encCal);
    sre.showAndWait();

    sre.release();
    this.updateGUI();
}

Я подтвердил, что получаю исключение во время метода FXMLLoader.load(). Я также решил, что ошибка возникает до того, как любой код в моем методе initialize() имеет шанс запустить. Часть трассировки стека, которую я получаю от load(), находится здесь:

java.lang.IllegalAccessException: Class sun.reflect.misc.ReflectUtil 
    can not access a member of class org.kls.md.censusassistant.DCServRecEditor 
    with modifiers ""
file:/D:/Documents/NetBeansProjects/CensusAssistant/dist/run1284250063/CensusAssistant.jar!/org/kls/md/censusassistant/fxml/GUIServRecEditor.fxml:13
  at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:738)
  at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:775)
  at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:180)
  at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:563)
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2314)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2131)
  at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2028)
  at org.kls.md.censusassistant.DialogController.loadFXML(DialogController.java:63)
  at org.kls.md.censusassistant.DCMainEditor.handleServicesEdit(DCMainEditor.java:330)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

        ...

Caused by: java.lang.IllegalAccessException: Class sun.reflect.misc.ReflectUtil
    can not access a member of class org.kls.md.censusassistant.DCServRecEditor
    with modifiers "" 
  at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:95)
  at java.lang.Class.newInstance0(Class.java:368)
  at java.lang.Class.newInstance(Class.java:327)
  at sun.reflect.misc.ReflectUtil.newInstance(ReflectUtil.java:46)
  at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:731)
... 66 more

Мой класс DCServRecEditor является подклассом DialogController. Это довольно нормальный класс контроллера FXML:

class DCServRecEditor extends DialogController {

    private int m_dialogMode = DB.DBEDIT_MODE_ADD;
    private int m_selServ = -1;
    private GregorianCalendar m_cal = null;


    @FXML // ResourceBundle that was given to the FXMLLoader
    private ResourceBundle resources;

    @FXML // URL location of the FXML file that was given to the FXMLLoader
    private URL location;

    @FXML // fx:id="ancMatchSelector"
    private AnchorPane ancMatchSelector; // Value injected by FXMLLoader

    @FXML // fx:id="ancServEditor"
    private AnchorPane ancServEditor; // Value injected by FXMLLoader

    @FXML // fx:id="ancServRecEditor"
    private AnchorPane ancServRecEditor; // Value injected by FXMLLoader

        ...
}

У меня есть двойной и тройной флажки, чтобы убедиться, что в FXML не было именованного элемента управления, у которого также не было поля экземпляра в классе контроллера. Все поля экземпляра помечены тегом @FXML.

Название класса контроллера в FXML совпадает с именем моего java файла и имеет соответствующую квалификацию. Ошибка возникает до того, как вызывается initialize(), поэтому я ничего не думаю об этом с initialize(), хотя я проверил, чтобы он также был помечен @FXML.

Скелет для моего класса контроллера был скопирован и вставлен из Scene Builder... Я вернулся и перепробовал блоки из Scene Builder, чтобы убедиться, что в моем java файле не было элемента управления.

Сообщение об ошибке не дает мне никаких сведений о члене, с которым у него есть проблема, кроме как сказать, что у него есть модификаторы "". Я вернулся к классу контроллера и сделал все члены с доступом по умолчанию public, и я все еще получаю ошибку.
Я даже не знаю, где в моем классе возникает проблема. У кого-нибудь есть идеи о том, что здесь происходит не так?

4b9b3361

Ответ 1

Еще одна смущающе простая проблема.

Я удивлен, что кто-то сейчас не прыгнул.

Проблема была в моем классе DCServRecEditor. Обратите внимание, что класс был объявлен с помощью разрешения default доступа.

JavaFX требует, чтобы классы контроллеров были сделаны public.

Чтобы быть справедливым для себя, сообщение об ошибках Java в этой ситуации отвратительно и вводит в заблуждение. Трассировка стека ясно показывает, что Java жалуется, что не может получить доступ к члену моего класса, поэтому я сосредоточен на своих полях и методах экземпляра. Java действительно должна была жаловаться, что именно сам класс не мог получить доступ, а не его членов.

Ответ 2

Я предпочитаю объявлять каждый метод и публиковать его.