JavaFX 事件处理程序 nullpointerException
JavaFX eventhandler nullpointerException
我有一个 Gui,它有几个不同的 类,它们使用相同的事件处理程序。我似乎找不到解决方案的一个问题是,当事件处理程序正在寻找正确的方法调用并偶然发现一个尚未初始化的按钮时,如何避免出现空指针异常。
我有几个按钮只有在用户进入 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() 时,我都会收到空指针异常。有没有人有一种聪明的方法来处理这类问题,而不必将其分成几个不同的处理程序。
@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
向使用 cAG
的代码添加空检查
/* right here */
else if( cAG != null && e.getSource() == cAG.getRegistrate()) {
System.out.println("it stop here on registrate");
createAccount();
}
如果 &&
符号 short circuits 为假,则永远不会到达 cAG.getRegistrate()
如果 cAG
为空
顺便说一句 JOptionPane
是 swing 的一部分,java 8 更新 40 推出了一个新的 JavaFX 对话框 API
在事件处理程序的开头获取事件源并将其设置为变量:
@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 语句中直接使用 Button,但可以使用按钮中的文本。
我有一个 Gui,它有几个不同的 类,它们使用相同的事件处理程序。我似乎找不到解决方案的一个问题是,当事件处理程序正在寻找正确的方法调用并偶然发现一个尚未初始化的按钮时,如何避免出现空指针异常。 我有几个按钮只有在用户进入 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() 时,我都会收到空指针异常。有没有人有一种聪明的方法来处理这类问题,而不必将其分成几个不同的处理程序。
@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
向使用 cAG
/* right here */
else if( cAG != null && e.getSource() == cAG.getRegistrate()) {
System.out.println("it stop here on registrate");
createAccount();
}
如果 &&
符号 short circuits 为假,则永远不会到达 cAG.getRegistrate()
如果 cAG
为空
顺便说一句 JOptionPane
是 swing 的一部分,java 8 更新 40 推出了一个新的 JavaFX 对话框 API
在事件处理程序的开头获取事件源并将其设置为变量:
@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 语句中直接使用 Button,但可以使用按钮中的文本。