我们有一个gui,我们用来设置团队,我们为每个团队分配2个驱动程序,另外还有2个引擎,1个机制和1个aerodinamic以及1个最具战略性。 在我们的gui中,我们将它们全部设置好,然后我们初始化上述每个值。我们的GUI是某种赛车模拟,它应该让胜利者回归。
但是每次我们编译GUI时,都会收到此错误:
线程中的异常" JavaFX应用程序线程" 显示java.lang.NullPointerException 在models.Champ.calcRisk(Champ.java:75) 在models.Champ.simtRace(Champ.java:102) at views.RScene.start(RScene.java:317) at views.RScene.lambda $ 0(RScene.java:107) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 在com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 在com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 在javafx.event.Event.fireEvent(Event.java:198) 在javafx.scene.Node.fireEvent(Node.java:8413) 在javafx.scene.control.Button.fire(Button.java:185) at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) at com.sun.javafx.scene.control.skin.BehaviorSkinBase $ 1.handle(BehaviorSkinBase.java:96) at com.sun.javafx.scene.control.skin.BehaviorSkinBase $ 1.handle(BehaviorSkinBase.java:89) at com.sun.javafx.event.CompositeEventHandler $ NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 在com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 在com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 在javafx.event.Event.fireEvent(Event.java:198) 在javafx.scene.Scene $ MouseHandler.process(Scene.java:3757) 在javafx.scene.Scene $ MouseHandler.access $ 1500(Scene.java:3485) 在javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) 在javafx.scene.Scene $ ScenePeerListener.mouseEvent(Scene.java:2494) at com.sun.javafx.tk.quantum.GlassViewEventHandler $ MouseEventNotification.run(GlassViewEventHandler.java:381) at com.sun.javafx.tk.quantum.GlassViewEventHandler $ MouseEventNotification.run(GlassViewEventHandler.java:295) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda $ handleMouseEvent $ 354(GlassViewEventHandler.java:417) at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416) 在com.sun.glass.ui.View.handleMouseEvent(View.java:555) 在com.sun.glass.ui.View.notifyMouse(View.java:937) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda $ null $ 148(WinApplication.java:191) 在java.lang.Thread.run(未知来源)
这真的很奇怪,因为我们不知道如何以及为什么某些东西是零,我们对它进行了调整,似乎一切正常(通过调试)但是当你运行main方法时我们得到所有这些跟随错误。
我们有一个方法
public double calcRisk(TDriver td) {
double risk = MIN_RISK;
risk += td.getCar().getSetupStrategy();
risk += (100 - td.getTeam().getStrategist().getProficiency());
return risk;
}
以及模拟我们所拥有的种族的方法:
double crashRisk = calcRisk(td);
and this method:
private void beginRace() {
int raceNumber = Interact.game.getChamp().getNumber();
System.out.println("RN " + raceNumber);
StartInterac.game.getCham().simulateNextRace();
rScene();
}
,下一个错误在以下方法中:
private void raceStartScene() {
.....rest of the code.......
raceBtn.setOnAction(e -> {
beginRace();
});
......rest of the code......
}
编辑:
我们有一个geeTeam,它位于名为DriverPerTeam
的类中我们检查了这个方法:
public double calcRisk(TDriver td) {
System.out.println("---check----");
System.out.println("1 "+td.getTeam());
System.out.println("2 "+td.getTeam().getStrategist());
System.out.println("3 "+td.getTeam().getStrategist().getProficiency());
System.out.println("-------------");
double risk = MIN_RISK;
risk += td.getCar().getSetupStrategy();
risk += (100 - td.getTeam().getStrategist().getProficiency());
return risk;
}
现在它返回这样的答案:
---check---- 1 models.Team@627f66d0 2 models.Strategist@1c00c341 3 71.0 ------------- ---check---- 1 models.Team@627f66d0 2 models.Strategist@1c00c341 3 71.0 ------------- ---check---- 1 null Exception in thread "JavaFX Application Thread" java.lang.NullPointerException at models.Champ.calcRisk(Champ.java:76) at models.Champ.simRace(Champ.java:108) at views.RScene.beginRace(RScene.java:317) . . . . ---check---- 1 models.Team@627f66d0 2 models.Strategist@1c00c341 Exception in thread "JavaFX Application Thread" 3 71.0 ------------- ---check---- 1 models.Team@627f66d0 2 models.Strategist@1c00c341 3 71.0 ------------- ---check---- 1 null java.lang.NullPointerException at models.Champ.calcRisk(Champ.java:76) at models.Champ.simRace(Champ.java:108) at views.RScene.beginRace(RScene.java:317) . . . . . .
任何人都可以在这种情况下帮助我吗?
答案 0 :(得分:0)
如果查看堆栈跟踪,错误发生在RScene:107,调用者是javafx。所以问题不在于beginRace方法及其调用者raceStartScene。 我的猜测是在这一行(似乎是一个属性):
double crashRisk = calcRisk(td);
在创建此对象时隐式调用calcRisk(td),您无法保证td不为null。
我的良好实践建议永远不要在声明中初始化变量,而是在显式构造函数中执行,然后检查可能出现的失败快速行为的每一个无效。
public class YourClass{
double crashRisk;
public YourClass(){
TDriver td = ...//get td
if(td == null){
throw new YourExplicitException();
}
crashRisk = calcRisk(td);
}
PS:我们可能需要这条线的背景" double crashRisk = calcRisk(td);"你能提供更多来源吗?