[英]my if statement in my while loop does not activate on its own in Java?
好的,所以我在 Java 中遇到了这个奇怪的故障,我已经解决了这个问题,但我不明白为什么会出现这个问题。 所以我有一个while循环,循环一直在等待我的字符串变量“input”发生变化,当按下回车键时输入发生变化。 当 boolean “等待”为真时,while 循环继续循环。 所以 while 循环不断循环,其中有一个 if-else 语句,if 语句说如果“输入”仍然是“”,那么“等待”继续等于真。 否则,等待 = 假。 但是,当这是循环时,我可以在输入将读取的字段中输入文本并按 Enter,但是当我执行任何操作时,什么都没有发生。 除非我的 while 循环中有其他代码。 output 文本中的任何其他代码以某种方式解决了这个问题,我不明白为什么。 我将展示非工作代码和工作代码示例。
不工作
boolean waiting = true;
while(waiting)
{
if(input.equals(""))
waiting = true;
else
waiting = false;
//System.out.println("waiting");
}
在职的
boolean waiting = true;
while(waiting)
{
if(input.equals(""))
waiting = true;
else
waiting = false;
System.out.println("waiting");
}
我不明白为什么这解决了这个问题,它没有为程序添加任何功能,我只是用它来查看循环是否正在循环,突然整个问题消失了,为什么这能解决这个问题?
好的,所以评论的人能够给我一个可行的解决方案,他们也解释了这个故障。 Stephen P 建议这可能是线程饥饿,他建议将我的打印声明替换为
Thread.currentThread().yield();
这解决了问题,感谢斯蒂芬 P 的帮助。
对于那些之前在程序中询问上下文的人,“输入”设置为“”,所以它不是 null,当按下回车键时,会出现以下代码:
public helloWorld(){
jta.setEditable(false);
stats.setEditable(false);
add(jtf, BorderLayout.SOUTH);
add(jta, BorderLayout.CENTER);
add(stats, BorderLayout.EAST);
stats.setBorder(BorderFactory.createCompoundBorder(border, BorderFactory.createEmptyBorder(10,10,10,10)));
jta.setBorder(BorderFactory.createCompoundBorder(border, BorderFactory.createEmptyBorder(10,10,10,10)));
jtf.setFont(jtf.getFont().deriveFont(Font.ROMAN_BASELINE, 20f));
jtf.setBorder(new LineBorder(Color.BLACK, 2));
jta.setText("The game is now beginning\n"
+ "What name do you want to give your character?\n");
stats.setText("");
jtf.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
input = jtf.getText();
//ystem.out.println("heard");
}
});
}
其中 jtf 是用户输入文本的 java 文本字段。 这是在 main 方法中使用的。
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
frame = new helloWorld();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
//System.out.println("listening");
}
});
input = "";
playGame();
}
它最终确实是线程耗尽,只是循环运行得太快了,所以输入从来没有机会得到更新。 再次感谢斯蒂芬 P
构造函数也称为 hello world 因为我只有一个 hello world 文件不断准备好 go 作为测试文件,是的,我知道它看起来不合适我很抱歉。 对不起,我应该预先提供更多背景信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.