gpt4 book ai didi

java - 尝试修复线程 "JavaFX Application Thread"java.lang.NullPointerException 中的 java 异常

转载 作者:太空宇宙 更新时间:2023-11-04 11:50:36 25 4
gpt4 key购买 nike

我们有一个用于设置团队的 GUI,我们为每个团队分配 2 名车手,外加 2 名引擎、1 名机械师和 1 名空气动力师以及 1 名策略师。在我们的 gui 中,我们设置了所有这些,并初始化了上述每一项的值。我们的 GUI 是某种赛车模拟,它应该返回获胜者。

但是每次我们编译 GUI 时,都会收到此错误:

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException at models.Champ.calcRisk(Champ.java:75) at 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) at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) at javafx.event.Event.fireEvent(Event.java:198) at javafx.scene.Node.fireEvent(Node.java:8413) at 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) at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) at javafx.event.Event.fireEvent(Event.java:198) at javafx.scene.Scene$MouseHandler.process(Scene.java:3757) at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) at 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) at com.sun.glass.ui.View.handleMouseEvent(View.java:555) at 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) at java.lang.Thread.run(Unknown Source)

这真的很奇怪,因为我们不知道如何以及为什么某些值为零,我们对其进行了调试,似乎一切正常(通过调试),但是当您只运行 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)
.
.
.
.
.
.

在这种情况下任何人都可以帮助我吗?

最佳答案

如果您查看堆栈跟踪,错误位于 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);”的上下文你能提供更多来源吗?

关于java - 尝试修复线程 "JavaFX Application Thread"java.lang.NullPointerException 中的 java 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41876168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com