繁体   English   中英

我的while循环中的if语句不会在Java中自行激活?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM