Java 无止境的循环,即使循环是好的
这两个方法都在同一个类中。 当我在文本区输入hi时,按下send键 它不断地(在我的文本区域)添加“你好,”+名字 “:你在一个黑暗的房间里,你有一个装满用品的背包。你会怎么做?” 当我输入“打开背包”时,它回应道 “向计算机问好”而不是调用start2()方法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
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方法中,您再也不会读取输入dooinginput=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();