Обработчик событий JavaFX nullpointerException

У меня есть графический интерфейс с несколькими разными классами, который использует один и тот же обработчик событий. Проблема, которую я не могу найти решения, заключается в том, как избежать получения исключения nullpointerexception, когда обработчик событий ищет правильный вызов метода и натыкается на кнопку, которая еще не инициализирована. У меня есть пара кнопок, которые будут инициализированы только тогда, когда пользователь перейдет на этап createAccountGui.

public class GuiHandler implements EventHandler<ActionEvent> {
    // this class take care off the EventHandler (buttons, all the buttons method).
    private UserGui uG;
    private AdvSearch aS;
    private LogIn logI;
    private CreateAccGui cAG;
    private OrganizerGui oG;
    private AdminGui aG;
    private PersonRegister pR;

    public GuiHandler() {
        uG = new UserGui(this);
    } 

Если CreateAccGui не был инициализирован, всякий раз, когда дело доходит до cAG.getRegistrate(), я получаю исключение nullpointerexception. Есть ли у кого-нибудь умный способ справиться с такой проблемой, не разделяя ее на несколько разных обработчиков.

@Override
    public void handle(ActionEvent e) {
        try {
            //where all the button goes 2 when clicked on and perform the method they are supposed 2 do
            // UserGui class buttons
            if(e.getSource() == uG.getLogInB()) {
                logI = new LogIn(this);
            } else if (e.getSource() == uG.getAdvSearch()) {
                aS = new AdvSearch(this);
            } else if (e.getSource() == uG.getSearch()) {

            }
            // the buttons in LogIn class
            else if(e.getSource() == logI.getSignIn()) {
                signIn();
            } else if(e.getSource() == logI.getCreateAcc()) {
                logI.logInStage.close();
                cAG = new CreateAccGui(this);
            }
            //the buttons in CreateAccGui class
            else if(e.getSource() == cAG.getRegistrate()) {
                System.out.println("it stop here on registrate");
                createAccount();
            } else if(e.getSource() == cAG.getCancelReg()) {
                cAG.getCreateStage().close();
                logI = new LogIn(this);
            }
            //the buttons in AdminGui for setting text from the admin field 2 the userGui
            else if(e.getSource() == aG.getAdmLogout()) {
                aG.stage.close();
            } else if(e.getSource() == aG.getHomeAreaButton()) {
                uG.getHomeNews().setText(aG.getHomeArea().getText());
            } else if(e.getSource() == aG.getAboutButton()) {
                uG.getAboutArea().setText(aG.getAboutArea().getText());
            } else if(e.getSource() == aG.getRentButton()) {
                uG.getRentArea().setText(aG.getRentArea().getText());
            }
        } catch(NumberFormatException nfe) {
            JOptionPane.showMessageDialog(null, "Feil format på noen felter, gjerne endre på dem", "Nummer Format", JOptionPane.ERROR_MESSAGE);
        }
    } // End of Handler method
}// End of GuiHandler class

person Huy Trần    schedule 24.04.2015    source источник


Ответы (2)


Добавьте нулевую проверку в код, который использует cAG

     /* right here */
else if(  cAG != null  && e.getSource() == cAG.getRegistrate()) {

System.out.println("it stop here on registrate");
    createAccount();
}

Символ && короткое замыкание, если он ложен, и никогда не достигнет cAG.getRegistrate(), если cAG нулевой

Кстати, JOptionPane является частью свинга, и обновление 40 java 8 вышло с новым диалоговым API JavaFX.

person J Atkin    schedule 24.04.2015

В начале вашего обработчика событий получите источник события и установите его в переменную:

@Override
public void handle(ActionEvent e) {
  Button sourceBtn = (Button) e.getSource();
    try {
      //where all the button goes 2 when clicked on and perform the method they are supposed 2 do
      // UserGui class buttons
       switch(sourceBtn.getText()){
       case "LogIn":
          logI = new LogIn(this);
          break;
        case "Advanced Search":
          aS = new AdvSearch(this);
          break;
        case "Search":
          break;
        case "Sign In":
          signIn();
        break;
        case "Create Acc":
          logI.logInStage.close();
          cAG = new CreateAccGui(this);
        break;
        case "Registrate":
          System.out.println("it stop here on registrate");
          createAccount();
          break;
        case "Cancel Reg":
          cAG.getCreateStage().close();
          logI = new LogIn(this);
        break;
        case "AdmLogout":
          aG.stage.close();
          break;
        case "HomeAreaButton":
          uG.getHomeNews().setText(aG.getHomeArea().getText());
        break;
        case "About":
          uG.getAboutArea().setText(aG.getAboutArea().getText());
        break;
        case "Rent":
          uG.getRentArea().setText(aG.getRentArea().getText());
          break;
      }
    } catch(NumberFormatException nfe) {
               JOptionPane.showMessageDialog(null, "Feil format på noen felter, gjerne endre på dem", "Nummer Format", JOptionPane.ERROR_MESSAGE);
            }
        } // End of Handler method
    }// End of GuiHandler class

Затем вы можете поместить свою логику в оператор switch для каждой кнопки. Таким образом, вам не нужно просматривать все эти операторы if в поисках источника. Я не думаю, что вы можете использовать кнопку непосредственно в операторе switch, но вы можете использовать текст в кнопке.

person JeramyRR    schedule 24.04.2015
comment
Спасибо, это работает, но я думаю, что это может перекрываться с некоторыми другими кнопками с регистром строчки, если некоторые из кнопок имеют одинаковое имя, когда мы сравниваем getText() кнопки. Я все еще новичок в Java, поэтому, если я ошибаюсь, поправьте меня ^^, - person Huy Trần; 25.04.2015