2017-01-26 137 views
1

我們有一個gui用於設置團隊,並且我們爲每個團隊分配2個驅動程序,加上2個引擎,1個機械師和1個aerodinamic plus 1最具戰略意義。 在我們的gui中,我們將它們全部設置好,然後初始化上述每個值。我們的圖形用戶界面是某種賽車模擬,它應該返回贏家。試圖解決線程「JavaFX應用程序線程」中的Java異常java.lang.NullPointerException

但是每次我們編譯的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)

這真是奇怪,因爲我們不知道如何和爲什麼事情是零,我們debuged它,它似乎一切工作正常(通過調試)但是當你運行主要方法時,我們會得到所有這些錯誤。

我們有一個方法

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...... 
    } 

編輯:

我們amethod方法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 [email protected] 
    2 [email protected] 
    3 71.0 
    ------------- 
    ---check---- 
    1 [email protected] 
    2 [email protected] 
    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 [email protected] 
2 [email protected] 
Exception in thread "JavaFX Application Thread" 3 71.0 
------------- 
---check---- 
1 [email protected] 
2 [email protected] 
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

可能重複[什麼是NullPointerException,以及如何解決它?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-doi-i-fix - ) – resueman

+0

@resueman該解決方案沒有爲我們工作! –

+0

哪一個是「Champ」類中的第75行 –

回答

0

如果你看看stacktrace,錯誤在RScene:107,調用者是javafx。所以問題不在於beginRace方法及其調用者raceStartScene。 我的猜測是,在這條線(似乎是一個屬性):

double crashRisk = calcRisk(td); 

你叫隱calcRisk(TD)創建該對象時,你有沒有保證,TD不爲空。

我的良好做法建議是,永遠不要在聲明中初始化變量,而是在顯式構造函數中進行初始化,然後檢查每個可能出現快速失敗行爲的無效性。 PS:我們可能需要這一行的上下文「double crashRisk = calcRisk(td);」你能提供更多的資源嗎?

+0

在構造函數td是所有teamdrivers的列表,所以你不能只爲其中的一個想法 –

+0

對不起,我需要完整的源代碼來理解。 – pdem

相關問題