【问题标题】:Simple Calculator (GUI) Causing Exception [duplicate]导致异常的简单计算器(GUI)
【发布时间】:2018-08-14 01:52:54
【问题描述】:

我正在尝试制作一个带有图形用户界面的简单计算器;但是,我无法从文本字段中添加两个值。每次我尝试计算这些值时,我都会收到一个异常。有人可以帮我解决这个问题吗?我对Java相当陌生,我愿意接受反馈和建议。例外情况如下。

谢谢,

凯尔

public class Calculator extends Application 
{
private Label firstValue;
private Label secondValue;
private Label sum;
private Button myButton;
private TextField textSum;
private TextField textFirst;
private TextField textSecond;

public String calculation()
{
    String getTextFirst = textFirst.getText();
    String getTextSecond = textSecond.getText();

    int total = Integer.parseInt(getTextFirst) + 
    Integer.parseInt(getTextSecond);
    String realTotal = String.valueOf(total);
    return realTotal;
}

public void start(Stage myStage)
{

    myStage.setTitle("Simple Calculator");
    GridPane rootNode = new GridPane();
    rootNode.setAlignment(Pos.CENTER);
    rootNode.setPadding(new Insets(30));
    Scene myScene = new Scene (rootNode, 400 , 300);
    firstValue = new Label ("First Value: ");
    secondValue = new Label ("Second Value: ");
    sum = new Label ("Sum is: ");

    textFirst = new TextField();
    textSecond = new TextField();
    textSum = new TextField();

    textSum.setEditable(false);
    myButton = new Button ("Calculate");

    rootNode.add(firstValue, 1, 0);
    rootNode.add(textFirst, 2, 0);
    rootNode.add(secondValue, 1, 1);
    rootNode.add(textSecond, 2, 1);
    rootNode.add(sum, 1, 2);
    rootNode.add(textSum, 2, 2);
    rootNode.add(myButton, 2, 3);

    myButton.setOnAction(new ButtonHandler());


    myStage.setScene(myScene);
    myStage.show();



}

class ButtonHandler implements EventHandler<ActionEvent>
{
    public void handle(ActionEvent e)
    {
        Calculator finalTotal = new Calculator();

        myButton.setText("Calculating");

        textSum.setText(finalTotal.calculation());
    }
}


public static void main(String[] args)
{
    launch(args);
}
}

Simple Calculator Picture

Exception in thread "JavaFX Application Thread" 
java.lang.NullPointerException
at Calculator.calculation(Calculator.java:22)
at Calculator$ButtonHandler.handle(Calculator.java:75)
at Calculator$ButtonHandler.handle(Calculator.java:1)

【问题讨论】:

  • 您真的需要在动作处理程序中创建Calculator 的新实例吗?
  • 你应该分享异常是什么
  • 寻求调试帮助的问题(“导致异常”)必须包括所需的行为、特定问题或错误以及重现所需的最短代码它在问题本身。没有明确问题陈述的问题对其他读者没有用处。见:minimal reproducible example

标签: java javafx


【解决方案1】:

首先,您的ButtonHandler 正在创建一个Calculator 的新实例,它与当前显示在屏幕上的Calculator 实例无关

class ButtonHandler implements EventHandler<ActionEvent>
{
    public void handle(ActionEvent e)
    {
        Calculator finalTotal = new Calculator();

        myButton.setText("Calculating");

        textSum.setText(finalTotal.calculation());
    }
}

这意味着当calculation 被调用时...

public String calculation()
{
    String getTextFirst = textFirst.getText();
    String getTextSecond = textSecond.getText();

    int total = Integer.parseInt(getTextFirst) + Integer.parseInt(getTextSecond);
    String realTotal = String.valueOf(total);
    return realTotal;
}

由于您的 UI 组件是在 start 方法中创建的,而在您创建第二个实例时永远不会调用该方法,因此 textFirsttextSecond 都是 null

首先修改您的处理程序以引用Calculator

class ButtonHandler implements EventHandler<ActionEvent>
{
    private Calculator calculator;

    public ButtonHandler(Calculator calculator) {
        this.calculator = calculator
    }

    public void handle(ActionEvent e)
    {
        this.calculator.calculation();
    }
}

此时,操作时,您可以简单地将Calculator 实例的所有calculation 实际在屏幕上

然后您需要更新处理程序的创建...

myButton.setOnAction(new ButtonHandler(this));

最后,我会更新 calculation 来更新 UI,因为字段是 private...

public void calculation()
{
    String getTextFirst = textFirst.getText();
    String getTextSecond = textSecond.getText();

    int total = Integer.parseInt(getTextFirst) + Integer.parseInt(getTextSecond);
    String realTotal = String.valueOf(total);

    textSum.setText(realTotal);
}

【讨论】:

  • "textFirst.getText()textSecond.getText() 将返回 null 或空字符串,这可能是您的异常的原因" 不,afaik getText 永远不会返回 @ 987654342@,但是一个空字符串会导致NumberFormatException 不是 NPE。对于新的Calculator 实例textFirsttextSecond 未初始化。
  • @fabian 是的,但是当我回答时,我所拥有的只是“一个例外”,所以这只是猜测 - 更新了
猜你喜欢
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 2012-05-12
  • 2011-09-27
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
相关资源
最近更新 更多