Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无止境的循环,即使循环是好的_Java_Loops_Jframe - Fatal编程技术网

Java 无止境的循环,即使循环是好的

Java 无止境的循环,即使循环是好的,java,loops,jframe,Java,Loops,Jframe,这两个方法都在同一个类中。 当我在文本区输入hi时,按下send键 它不断地(在我的文本区域)添加“你好,”+名字 “:你在一个黑暗的房间里,你有一个装满用品的背包。你会怎么做?” 当我输入“打开背包”时,它回应道 “向计算机问好”而不是调用start2()方法 public class UI extends javax.swing.JFrame{ public void start(){ appendResponse(Bot+": Hello, "+Name + "\n

这两个方法都在同一个类中。 当我在文本区输入hi时,按下send键 它不断地(在我的文本区域)添加“你好,”+名字 “:你在一个黑暗的房间里,你有一个装满用品的背包。你会怎么做?” 当我输入“打开背包”时,它回应道 “向计算机问好”而不是调用start2()方法

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

    }
}
中断无效,因为您再次调用start方法

然后在start方法中,您再也不会读取输入dooing
input=txtInput.getText()
这意味着输入与引导您进入else条件的值相同

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

这将循环,直到您很快或稍后出现stackoverflow….

循环不是这里的问题。它甚至不是循环:您可以删除
while(true)
和中断,但仍然存在相同的问题

问题是
start
中的条件检查
input
的值;但实际上并没有更改
input
的值,因此一旦它接受负分支,它将再次调用
start()
,检查
input
,接受负分支,等等,直到得到
堆栈溢出错误

在检查
输入之前,需要为其指定一个新值,该值可能会发生变化

 if(input.toLowerCase().equals("open backpack")){
但是请注意,递归调用并不是实现这一点的好方法。更好的办法是:

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

您正在基于
input
的值递归调用
start()
,而实际上没有更改
input
的值。这个循环实际上不是一个循环,因为你打破了它。是的,粗心的错误。我把它弄干净了already@AndyTurnersecond方法的else条件--->在
appendResponse(Bot+“:向计算机问好\n”))之后添加
start()
。看起来这是一次否决权攻击,我看到其他被删除的问题被否决,没有任何理由或评论
while (true) {
  input = /* get input from user */;
  if (input.equalsIgnoreCase("open backpack")) break;

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