即使循环良好,也会产生无限循环

时间:2017-06-10 06:57:07

标签: java loops jframe

public class UI extends javax.swing.JFrame{
    public void start(){
        appendResponse(Bot+": Hello, "+Name + "\n");
        appendResponse(Bot + ": You are in a dark room, you have a backpack full of supplies. What will you do?\n");
        if(input.toLowerCase().equals("open backpack")){
            start2();
        }else{
            while(true){
                appendResponse(Bot + ": Sorry invalid input!\n");
                start();
                break;
            }
        }
    }
    private void btnSendActionPerformed(java.awt.event.ActionEvent evt) {                                        
        You = Name + ": " +txtInput.getText()+"\n";
        input = txtInput.getText();
        txtRespond.append(You);
        txtInput.setText("");
        if(input.equals("hi")){ 
            appendResponse(Bot+": Hello, "+Name + "\n");
            start();
        }else{
            appendResponse(Bot + ": say hi to computer\n");
        }

    }
}

两种方法都属于同一类。 当我在我的textArea中输入hi时,按下发送 它不断追加(到我的textArea)“你好”,+名字 “:你在一个黑暗的房间,你有一个装满物资的背包。你会做什么?” 当我输入“打开背包”时,它回应了 “向计算机打招呼”而不是调用start2()方法

2 个答案:

答案 0 :(得分:1)

这个

while(true){
     appendResponse(Bot + ": Sorry invalid input!\n");
     start();
     break;
}

休息没用,因为你再次调用start方法......

然后在start方法中你永远不会再读取输入dooing input = txtInput.getText();,这意味着输入保持相同的值,使你通过其他条件

 if(input.toLowerCase().equals("open backpack")){

将循环,直到你很快或稍后得到stackoverflow ....

答案 1 :(得分:0)

循环不是问题。它甚至没有循环:你可以删除while (true)和休息,你仍然会遇到同样的问题。

问题是start中的条件会检查input的值;但你实际上并没有改变input的值,所以一旦它取消负分支,它再次调用start(),检查input,取负分支等,直到你得到StackOverflowError

在检查之前,您需要为input分配一个新值,并且可能会更改其价值。

public void start(){
  appendResponse(Bot+": Hello, "+Name + "\n");
  appendResponse(Bot + ": You are in a dark room, you have a backpack full of supplies. What will you do?\n");

  input = /* somehow get input from user */;

  if(input.toLowerCase().equals("open backpack")) {
    start2();
  } else {
    appendResponse(Bot + ": Sorry invalid input!\n");
    start();
  }
}

但请注意,递归调用不是一种好方法。更好的方法是:

while (true) {
  input = /* get input from user */;
  if (input.equalsIgnoreCase("open backpack")) break;

  appendResponse("invalid");
}
start2();