2016-02-21 1 views
1

Я создаю проект javafx, в котором я столкнулся с некоторыми проблемами, перечисленными ниже.Invocation target Исключение в Construtor - JavaFx

Во-первых, я получаю NullPointerException, когда я не был инициализацией 2 класса в конструкторе sfc = new ServerFrameController(); & sf = new ServerFrame(); .Even после поиска в течение нескольких часов, я не был в состоянии выяснить причину для исключения нулевого указателя. Тогда я подумал, что, возможно, инициализация классов может помочь. Но после добавления этих двух строк я получаю InvocationTargetException. Пожалуйста помоги!!

Исключение:

Exception in Application constructor 
java.lang.reflect.InvocationTargetException 
Caused by: java.lang.StackOverflowError 
    at com.socket.ServerFrameController.<init>(ServerFrameController.java:35) 
    at com.socket.ServerFrame.<init>(ServerFrame.java:28) 

Класс 1:

public class ServerFrame extends Application { 

    public ServerFrameController sfc; 
    public SocketServer server; 
    public Thread serverThread; 
    public String filePath = "D:\\Data.xml"; 
    public JFileChooser fileChooser; 
    public JFXPanel fxPanel; 

    public ServerFrame() { 
     sfc = new ServerFrameController(); 
     fxPanel = new JFXPanel(); 
     fxPanel.setVisible(true); 
     fileChooser = new JFileChooser(); 
    } 
    // Some More Code..... 
} 

Класс 2:

public class ServerFrameController implements Initializable { 

    ServerFrame sf; 
    @FXML 
    public TextField jTextField3; 
    @FXML 
    public Button jButton2; 
    @FXML 
    public Button jButton1; 
    @FXML 
    public TextArea jTextArea1; 

    public ServerFrameController() { 
     sf = new ServerFrame(); 
    } 
} 
+0

Ваш 'ServerFrameController' вызывает' ServerFrame', который снова вызывает 'ServerFrameController'. Ваш 'ServerFrameController' должен получить ваш аргумент' ServerFrame'. – aribeiro

+0

Я не очень хорошо знаком с JavaFX, поэтому я пишу только комментарий вместо ответа. При создании экземпляра «ServerFrame» это создает также «ServerFrameController», который, в свою очередь, создает «ServerFrame», который ... У вас есть смысл. Это приводит к 'StackOverflowError'. Я предполагаю, что вы хотите иметь конструктор 'ServerFramController (ServerFrame sf) {this.sf = sf; ...} 'и вызов в конструкторе ServerFrame:' ​​sfc = new ServerFrameController (this) '. – Seelenvirtuose

+0

Почему вы создаете экземпляр контроллера вообще? Обычно экземпляры контроллера создаются для вас с помощью «FXMLLoader» при загрузке файла FXML. –

ответ

0

Вы можете избежать проблемы StackOverflowError, передавая ссылку на ServerFrame к контроллеру , но, как правило, плохой практикой является обращение от this из конструктора.

public class ServerFrameController implements Initializable { 

    ServerFrame sf; 
    @FXML 
    public TextField jTextField3; 
    @FXML 
    public Button jButton2; 
    @FXML 
    public Button jButton1; 
    @FXML 
    public TextArea jTextArea1; 

    public ServerFrameController(ServerFrame sf) { 
     this.sf = sf; 
    } 
} 
public class ServerFrame extends Application { 

    public ServerFrameController sfc; 
    public SocketServer server; 
    public Thread serverThread; 
    public String filePath = "D:\\Data.xml"; 
    public JFileChooser fileChooser; 
    public JFXPanel fxPanel; 

    public ServerFrame() { 
     sfc = new ServerFrameController(this); 
     fxPanel = new JFXPanel(); 
     fxPanel.setVisible(true); 
     fileChooser = new JFileChooser(); 
    } 
    // Some More Code..... 
} 

Лучшим, вероятно, было бы выяснить исключение NullPointerException и найти подходящее решение для этого. Я бы предположил, что это как-то связано с порядком, который все инициализируется.

+0

«но в общем, это плохая практика, чтобы передать ссылку на это изнутри конструктора» => Почему? Я спрашиваю, потому что это совершенно правильно, и это не практическое упражнение. Обратите внимание, что только другой конструктор вызывается с помощью этой ссылки, а не произвольным методом. Конструкторы - вообще - не должны ничего делать, кроме хранения ссылок и инициализации объекта. В этом случае это безопасно. – Seelenvirtuose

+0

https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.5 ссылка на ссылку от конструктора сломала конечное поле – rell