【问题标题】:NullPointerException while using constructor in controller class. JavaFX在控制器类中使用构造函数时出现 NullPointerException。 JavaFX
【发布时间】:2015-06-09 02:26:02
【问题描述】:

这是我在这里的第一篇文章,所以我希望这个问题不是重复的。我是一名业余爱好者,正在尝试使用 JavaFX 创建一个可以管理辩论锦标赛的应用程序。

我想在 TournamentCreation 中创建一个 Singleton 对象,TournamentEditor 也可以访问和操作该对象。

似乎当我的 Singleton GlobalInstance 对象被创建(其中包含一个可以从其他地方访问和编辑的锦标赛)时,一个NullPointerException 被抛出。使用调试我已经设法弄清楚它是在GlobalInstance 调用默认的Tournament 构造函数时发生的。

代码时间。这是TournamentCreationController,其中错误以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);
}

}

这里是单例类:

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);
    }
}
}

【问题讨论】:

  • 这是一篇冗长而冗长的游荡帖子。请缩小范围以直接针对您的具体问题。提供尽可能多的上下文,但仅此而已。请参阅 How to Ask A Good QuestionOn Topic。您说人们总是向您询问更多信息,但这是您在这里的第一个问题?这没有意义。
  • 我的意思是当我看到其他问题时,但可以肯定的是,我会尽快收紧这篇文章。
  • 嗯,回答者想要关于问题的更多信息,而不是与问题本身无关的详细描述。例如。 TournamentCreationController.java 的第 84 行存在哪些代码?
  • 嗨 Uluk Biy,抱歉,我现在不在电脑旁,看不到行号。您能否简单引用您所询问的代码,我将解释我打算用它做什么?我假设您要询问最终的“myController.setScreen ...”代码。这是我从教程中获得的更改屏幕方法的一部分。它工作得很好,但我认为包括所有代码和完整的解释可能有点离题,但这里概述了该方法:blogs.oracle.com/acaicedo/entry/…
  • @MatthewOldham,添加为评论有点长,请参阅下面的答案。

标签: java model-view-controller javafx singleton javafx-2


【解决方案1】:

在编程时,错误信息是解决问题的最佳帮手。在 Java 中,异常的根本原因可以说明实际问题。因此,如果我们查看您的用例,

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

告诉我们,错误发生在 goToEditor() 类的第 84 行的 goToEditor() 方法中。然后,如果我们继续阅读其余的异常跟踪消息,我们会看到它的实际根本错误(原因),

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

这里是说错误的类型是NullPointerException,在Tournament类的第24行。

这些提示足以确定问题。

更新

根据您更新的问题,问题是 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.
}

【讨论】:

  • 谢谢你,会去尝试找出错误!
  • 在跟踪此错误后使用额外信息进行了编辑。
  • 非常感谢!现在都在工作。应编辑为已解决。
  • @MatthewOldham 不,不需要。该问题有一个可接受的答案,因此这意味着问题已解决。
猜你喜欢
  • 2016-10-20
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 2013-04-30
  • 2016-11-12
  • 2020-09-05
相关资源
最近更新 更多