为什么这个冰雹数字生成器不起作用?

时间:2017-03-07 19:05:20

标签: java jpanel actionlistener

我试图在JPanel上创建一个JButton,当点击它时,会产生一个冰雹数字(如果数字是偶数除以2;如果数字是奇数,则乘以3然后加一个)。但是,当我单击我的JButton时,程序冻结并且没有输出数字。为什么会这样?

这是我的代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Panel03 extends JPanel {
private JLabel label;
private JButton button;
private JTextField box;

public Panel03()
{
    box = new JTextField("0", 10);
    box.setForeground(Color.black);
    box.setHorizontalAlignment(SwingConstants.RIGHT);
    add(box);
    
    label = new JLabel();
    label.setFont(new Font("Serif", Font.BOLD, 20));
    label.setForeground(Color.blue);
    add(label);

    button = new JButton("Next");
    button.addActionListener(new Listener());
    add(button);
}

private class Listener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        String s = box.getText();
        int a = Integer.parseInt(s);
        int b = a;
        do {
            if(a%2 == 0){b/=2.0;}
            else{a=((3*b)+1);}
            label.setText(Integer.toString(b));
        }
        while(b!= 4||b!= 2||b!= 1);
    }
}
}

1 个答案:

答案 0 :(得分:0)

每当程序冻结时,无限循环是主要的嫌疑人。在这种情况下,将此行添加到循环

  System.out.printf("* a=%d b=%d\n",a,b);

永远显示a = 0和b = 0。由于a为零,因此%2 = 0,而b / = 2仍然为零,因此变量永远不会改变。从a = 1开始仍然卡在a = 4,b = 0。事实上,对于我输入的任何数字,b变为零并且循环卡住。我不确定你在这里尝试做什么,但我怀疑你的循环退出逻辑应该是而不是或者,并且需要捕获b = 0的可能性:

  while (b!=4 && b!=2 && b!=1 && b!=0);