【问题标题】:Can not resolve java.lang.NumberFormatException thrown by Integer.ParseInt无法解析 Integer.ParseInt 抛出的 java.lang.NumberFormatException
【发布时间】:2015-08-12 12:24:43
【问题描述】:

我收到此错误,但我似乎找不到可能导致它的原因。它说错误出现在我初始化变量bet 的那一行。如果我删除该行和Integer.parseInt(betTextFieldAmount),那么它会说错误在于初始化。

public class RollTheDice extends JFrame implements ActionListener {

    JButton roll = new JButton("Roll the Dice");
    JButton bet1 = new JButton("5$");
    JButton bet2 = new JButton("10$");
    JButton bet3 = new JButton("25$");
    JButton bet4 = new JButton("50$");
    JButton bet5 = new JButton("100$");

    JTextField betTextField = new JTextField(5);
    String betTextFieldAmount = betTextField.getText();
    int bet = Integer.parseInt(betTextFieldAmount);

    int money = 100;

    JLabel currentBet = new JLabel();
    JLabel currentMoney = new JLabel("Your money: " + money + "$");

    int myDice = new Random().nextInt(12) + 1;
    int AIDice = new Random().nextInt(12) + 1;

    public static void RollTheDice() {
        int myDice = new Random().nextInt(12) + 1;
        int AIDice = new Random().nextInt(12) + 1;
    }

    public RollTheDice() {
        setLayout(new FlowLayout());

        add(currentMoney);

        add(bet1);
        bet1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (money < 5) {
                    JOptionPane.showMessageDialog(null, "Not enough money!");
                } else {
                    money -= 5;
                    bet +=5;
                }
                currentMoney.setText(money + "$");
            }           
        });

        add(bet2);
        bet2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (money < 10) {
                    JOptionPane.showMessageDialog(null, "Not enough money!");
                } else {
                    money -= 10;
                    bet +=10;
                }
                currentMoney.setText(money + "$");
            }           
        });

        add(bet3);
        bet3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (money < 25) {
                    JOptionPane.showMessageDialog(null, "Not enough money!");
                } else {
                    money -= 25;
                    bet +=25;
                }
                currentMoney.setText(money + "$");
            }           
        });

        add(bet4);
        bet4.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (money < 50) {
                    JOptionPane.showMessageDialog(null, "Not enough money!");
                } else {
                    money -= 50;
                    bet +=50;
                }
                currentMoney.setText(money + "$");
            }           
        });

        add(bet5);
        bet5.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (money < 100) {
                    JOptionPane.showMessageDialog(null, "Not enough money!");
                } else {
                    money -= 100;
                    bet +=100;
                }
                currentMoney.setText(money + "$");
            }           
        });

        add(betTextField);
        betTextField.setEditable(false);
        add(roll);
        roll.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (myDice > AIDice) {
                    money += bet;
                    JOptionPane.showMessageDialog(null, "You won " + bet + "$");
                } else {
                    JOptionPane.showMessageDialog(null, "You lost " + bet + "$");
                }
                currentMoney.setText(money + "$");
                RollTheDice();
            }           
        });
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        // TODO Auto-generated method stub

    }
}

【问题讨论】:

  • 澄清一下:去掉解析方法时是不是同样的错误?
  • 是的,完全一样。
  • 正如其他人在 NumberFormatException 下面发布的那样,始终意味着传递给 parseInt 的字符串不是有效数字,因此您应该使用 try...catch 包装来处理错误数据。此外,您应该将初始化和解析分开,以便在传递数据数据时至少可以默认为一个值。
  • 那么在每个 ActionListener 中包围“赌注”?
  • 不,只有当您执行解析时,您才应该将 parse 方法包装在 try..catch 块中以捕获正在传递的无效数字数据并执行诸如提醒用户之类的操作。

标签: java user-interface parseint numberformatexception


【解决方案1】:

这是因为betTextFieldAmount 的值不是一个有效的整数,所以当您尝试使用Integer.parseInt(betTextFieldAmount); 对其进行转换时会引发异常。

您应该用try...catch 语句包围parseInt 调用,并在发生这种情况时向用户显示适当的错误消息。

更好的是,首先尝试通过限制可以在字段中输入的字符来防止用户输入非数字值,并添加一个空检查以捕获字段中没有输入值的情况。

【讨论】:

  • 如何限制文本字段中的某些字符?我不能让文本字段不可编辑吗?
  • 我也必须在开始时将字符串和整数包围起来,只有当我创建它们或每次我添加一个值来下注时?
  • 这里有一些关于限制字符的想法:stackoverflow.com/questions/15703644/…
  • 您应该用try..catch 块包围对Integer.parseInt 的任何调用
  • 我想我把它们都包围了,除了第一个(赌注初始化,因为一旦我这样做,我就会得到一大堆错误),但我仍然得到同样的错误。
【解决方案2】:

Integer.parseInt(betTextFieldAmount)导致此错误。
检查betTextFieldAmount 以查看它是否具有有效的整数值。
确保 betTextFieldAmount 不能为空,或在开头或结尾包含任何特殊字符或空格。

【讨论】:

    【解决方案3】:

    尝试验证您的 betTextField.getText() 是否不为空。我假设您的字段没有值,因此 getText 将返回 null 并且解析将失败

    【讨论】:

      猜你喜欢
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 2012-06-29
      • 2013-03-26
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多