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()方法
答案 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();