试图修复线程中的Java异常" JavaFX应用程序线程"显示java.lang.NullPointerException

时间:2017-01-26 14:50:58

标签: java user-interface nullpointerexception

我们有一个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)
.
.
.
.
.
.

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

1 个答案:

答案 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);"你能提供更多来源吗?

相关问题