2017-03-07 5 views
0

Ich versuche einen JButton auf einem JPanel zu erstellen, der, wenn er angeklickt wird, die Hailstone-Nummer erzeugt (wenn die Zahl gerade geteilt ist durch zwei; wenn die Zahl ungerade ist, multipliziere mit 3 und füge dann einen hinzu). Wenn ich jedoch auf meine JButton klicke, bleibt das Programm stehen und es wird keine Nummer ausgegeben. Warum passiert dies?Warum funktioniert dieser Hagelsteinnummernproduzent nicht?

Hier ist mein Code:

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

+0

Jede bestehende Nummer ist entweder nicht mehr als 4 oder nicht 2. Vielleicht meintest du '&&' anstelle von '||'. – shmosel

+0

Sie verwenden kein 'a', nachdem Sie den Wert innerhalb der Schleife festgelegt haben. –

Antwort

0

Immer wenn ein Programm friert, eine Endlos-Schleife ist ein Hauptverdächtiger. In diesem Fall zeigt das Hinzufügen dieser Zeile zu der Schleife, dass a = 0 und b = 0 für immer. Da a null ist, a% 2 = 0 und b/= 2 immer noch Null ist, ändern sich die Variablen nie. Beginnend mit a = 1 bleibt es bei a = 4 hängen, b = 0. Tatsächlich geht b für jede Zahl, die ich eingegeben habe, auf Null und die Schleife bleibt hängen. Ich bin nicht sicher, was Sie versuchen, hier zu tun, aber ich vermute, Ihre Loop-Ausstiegs-Logik sein sollte und statt oder, und muss die b = 0 Möglichkeit fangen:

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