2015-04-04 82 views
-1

這是我在這裏的第一篇文章,所以我希望這個問題不是重複的。我是一個正在嘗試使用JavaFX創建可以管理辯論錦標賽的應用程序的業餘愛好者。在控制器類中使用構造函數時出現NullPointerException。 JavaFX

我想在TournamentCreation中創建一個Singleton對象,TournamentEditor也可以訪問和操作它。

看來,當我的Singleton GlobalInstance對象被創建(其中包含一個可以從其他地方訪問和編輯的比賽)時,會引發NullPointerException。使用調試,我設法弄清楚它發生在GlobalInstance調用默認的構造函數Tournament

代碼時間。這裏就是錯誤與線GlobalInstance.getInstance().currentTournament().setRounds(roundsIn);

import java.net.URL; 
import java.util.ResourceBundle; 
import BusinessLogic.GlobalInstance; 
import javafx.collections.FXCollections; 
import javafx.event.ActionEvent; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.ChoiceBox; 
import javafx.scene.control.TextField; 

public class TournamentCreationController implements Initializable , ControlledScreen { 

ScreensController myController; 

@FXML 
TextField nameChooser; 

@FXML 
ChoiceBox roundNumberChooser; 

@FXML 
ChoiceBox breakNumberChooser; 

@FXML 
ChoiceBox noviceBreakNumberChooser; 

@FXML 
ChoiceBox eslBreakNumberChooser; 

@FXML 
ChoiceBox proAmBreakNumberChooser; 


/** 
* Initializes the controller class. 
*/ 
@Override 
public void initialize(URL url, ResourceBundle rb) 
{ 
    roundNumberChooser.setItems(FXCollections.observableArrayList(1,2,3,4,5,6,7,8,9)); 
    roundNumberChooser.getSelectionModel().select(4); 

    breakNumberChooser.setItems(FXCollections.observableArrayList(4,8,16,32,64)); 
    breakNumberChooser.getSelectionModel().selectFirst(); 

    noviceBreakNumberChooser.setItems(FXCollections.observableArrayList(0,4,8,16,32,64)); 
    noviceBreakNumberChooser.getSelectionModel().selectFirst(); 

    eslBreakNumberChooser.setItems(FXCollections.observableArrayList(0,4,8,16,32,64)); 
    eslBreakNumberChooser.getSelectionModel().selectFirst(); 

    proAmBreakNumberChooser.setItems(FXCollections.observableArrayList(0,4,8,16,32,64)); 
    proAmBreakNumberChooser.getSelectionModel().selectFirst(); 

} 

public void setScreenParent(ScreensController screenParent) 
{ 
    myController = screenParent; 
} 

@FXML 
private void goToEditor(ActionEvent event) 
{ 
    String nameIn = nameChooser.getText(); 
    int roundsIn = (int)roundNumberChooser.getSelectionModel().getSelectedItem(); 
    int openBreakTeamsIn = (int)breakNumberChooser.getSelectionModel().getSelectedItem(); 
    int eslBreakTeamsIn = (int)eslBreakNumberChooser.getSelectionModel().getSelectedItem(); 
    int noviceBreakTeamsIn = (int)noviceBreakNumberChooser.getSelectionModel().getSelectedItem(); 
    int proAmBreakTeamsIn = (int)proAmBreakNumberChooser.getSelectionModel().getSelectedItem(); 


    GlobalInstance.getInstance().currentTournament().setRounds(roundsIn); 
    GlobalInstance.getInstance().currentTournament().setOpenBreakTeams(openBreakTeamsIn); 
    GlobalInstance.getInstance().currentTournament().setESLBreakTeams(eslBreakTeamsIn); 
    GlobalInstance.getInstance().currentTournament().setNoviceBreakTeams(noviceBreakTeamsIn); 
    GlobalInstance.getInstance().currentTournament().setProAmBreakTeams(proAmBreakTeamsIn); 

    myController.setScreen(ScreensFramework.screen4ID); 
} 

} 

開始TournamentCreationController這裏是Singleton類:

public class GlobalInstance 
{ 
private final static GlobalInstance instance = new GlobalInstance(); 
private Tournament tournament = new Tournament(); 

public static GlobalInstance getInstance() 
{ 
    return instance; 
} 

public Tournament currentTournament() 
{ 
    return tournament; 
} 

} 

最後這裏是Tournament類(忽略大部分,出現確切的錯誤在name.set("name")的默認構造函數中):

import javafx.beans.property.BooleanProperty; 
import javafx.beans.property.IntegerProperty; 
import javafx.beans.property.StringProperty; 

public class Tournament 
{ 
private StringProperty name; 
private IntegerProperty rounds; 
private BooleanProperty eslBreak; 
private BooleanProperty noviceBreak; 
private BooleanProperty proAmBreak; 
private IntegerProperty openBreakTeams; 
private IntegerProperty eslBreakTeams; 
private IntegerProperty noviceBreakTeams; 
private IntegerProperty proAmBreakTeams; 

public Tournament() 
{ 
name.set("name"); 
rounds.set(0); 
eslBreak.set(false); 
noviceBreak.set(false); 
proAmBreak.set(false); 
openBreakTeams.set(4); 
eslBreakTeams.set(0); 
noviceBreakTeams.set(0); 
proAmBreakTeams.set(0); 
} 

public Tournament(String nameIn, int roundsIn, int openBreakTeamsIn, int eslBreakTeamsIn, int noviceBreakTeamsIn, int proAmBreakTeamsIn) 
{ 
name.set(nameIn); 
rounds.set(roundsIn); 
openBreakTeams.set(openBreakTeamsIn); 

if(eslBreakTeamsIn==0) 
{ 
    eslBreak.set(false); 
    eslBreakTeams.set(0); 
} 
else 
{ 
    eslBreak.set(true); 
    eslBreakTeams.set(eslBreakTeamsIn); 
} 

if(noviceBreakTeamsIn==0) 
{ 
    noviceBreak.set(false); 
    noviceBreakTeams.set(0); 
} 
else 
{ 
    noviceBreak.set(true); 
    noviceBreakTeams.set(noviceBreakTeamsIn); 
} 

if(proAmBreakTeamsIn==0) 
{ 
    proAmBreak.set(false); 
    proAmBreakTeams.set(0); 
} 
else 
{ 
    proAmBreak.set(true); 
    proAmBreakTeams.set(noviceBreakTeamsIn); 
} 
} 

public String getName() 
{ 
    return name.get(); 
} 

public void setName(String nameIn) 
{ 
    name.set(nameIn); 
} 

public int getRounds() 
{ 
    return rounds.get(); 
} 

public void setRounds(int roundsIn) 
{ 
    rounds.set(roundsIn); 
} 

public int getOpenBreakTeams() 
{ 
    return openBreakTeams.get(); 
} 

public void setOpenBreakTeams(int openBreakTeamsIn) 
{ 
    openBreakTeams.set(openBreakTeamsIn); 
} 

public boolean getESLBreak() 
{ 
    return eslBreak.get(); 
} 

public int getESLBreakNumber() 
{ 
    return eslBreakTeams.get(); 
} 

public void setESLBreakTeams(int eslBreakTeamsIn) 
{ 
    if (eslBreakTeamsIn==0) 
    { 
     eslBreak.set(false); 
     eslBreakTeams.set(0); 
    } 
    else 
    { 
     eslBreak.set(true); 
     eslBreakTeams.set(eslBreakTeamsIn); 
    } 
} 

public boolean getNoviceBreak() 
{ 
    return noviceBreak.get(); 
} 

public int getNoviceBreakNumber() 
{ 
    return noviceBreakTeams.get(); 
} 

public void setNoviceBreakTeams(int noviceBreakTeamsIn) 
{ 
    if (noviceBreakTeamsIn==0) 
    { 
     noviceBreak.set(false); 
     noviceBreakTeams.set(0); 
    } 
    else 
    { 
     noviceBreak.set(true); 
     noviceBreakTeams.set(noviceBreakTeamsIn); 
    } 
} 

public boolean getProAmBreak() 
{ 
    return proAmBreak.get(); 
} 

public int getProAmBreakNumber() 
{ 
    return proAmBreakTeams.get(); 
} 

public void setProAmBreakTeams(int proAmBreakTeamsIn) 
{ 
    if (proAmBreakTeamsIn==0) 
    { 
     proAmBreak.set(false); 
     proAmBreakTeams.set(0); 
    } 
    else 
    { 
     proAmBreak.set(true); 
     proAmBreakTeams.set(proAmBreakTeamsIn); 
    } 
} 
} 
+0

這是一個荒謬漫長而羅嗦的遊蕩帖子。請縮小一切,直接針對您的具體問題。根據需要提供儘可能多的上下文,但不要多。參見[如何提出一個好問題](http://stackoverflow.com/help/how-to-ask)和[On Topic](http://stackoverflow.com/help/on-topic)。你說人們總是問你更多的信息,但這是你的第一個問題嗎?這沒有意義。 – clearlight 2015-04-04 01:11:24

+0

我的意思是當我看到其他問題時,但當然,只要我能夠,我會努力收緊這篇文章。 – 2015-04-04 12:42:16

+0

那麼,回答者需要關於問題的其他信息,而不是關於與問題本身無關的詳細描述。例如。哪些代碼存在於TournamentCreationController.java的第84行? – 2015-04-04 12:46:27

回答

0

編程時,錯誤消息是最好的幫助解決問題。在Java中,異常的根本原因可以說明實際的問題。因此,如果我們看一下你的使用情況,

Caused by: java.lang.ExceptionInInitializerError 
at TabIt.TournamentCreationController.goToEditor(TournamentCreationController.java:84) 

告訴我們,在goToEditor()方法發生在TournamentCreationController班線84的錯誤。然後,如果我們繼續讀異常tracktrace消息的其餘部分,我們可以看到它的實際的根本錯誤(原因),

Caused by: java.lang.NullPointerException 
at BusinessLogic.Tournament.<init>(Tournament.java:24) 

這是說,錯誤類型爲NullPointerException,是在Tournament線24類。

這些提示足以確定問題。

UPDATE

根據您的更新問題,問題是,name變量尚未初始化。嘗試使用未初始化的對象會引發空指針異常。錦標賽的構造應該是:

public Tournament() 
{ 
    name = new SimpleStringProperty("name"); 
    rounds = new SimpleIntegerProperty(0); 
    eslBreak = new SimpleBooleanProperty(false); 
    // etc. 
} 

public Tournament(String nameIn, int roundsIn, int openBreakTeamsIn, int eslBreakTeamsIn, int noviceBreakTeamsIn, int proAmBreakTeamsIn) 
{ 
    name = new SimpleStringProperty(nameIn); 
    rounds = new SimpleIntegerProperty(roundsIn); 
    eslBreak = new SimpleBooleanProperty(openBreakTeamsIn); 
    // etc. 
} 
+0

感謝您的支持,我們會繼續努力尋找錯誤! – 2015-04-04 14:01:47

+0

跟蹤此錯誤後,使用額外信息編輯過。 – 2015-04-04 16:13:50

+0

@MatthewOldham更新了答案。 – 2015-04-04 16:30:08

相關問題