编辑:一个用户标记我的问题可能是这个问题的重复:“ What is the volatile keyword useful for ”,其标题是“What is the volatile keyword useful for?”。我读了这个问题,但我不明白它与我的问题有什么关系。
这是一个用两个 .java 文件编写的程序。我的问题涉及主要方法中的 if..else..。
请注意在下面的代码中,else {..} 中的单行被注释掉了。我将这个程序称为“版本 1”,我将在“版本 2”中将该行注释掉的程序称为该程序。
// -------------
// The code below is in IfElseBugProgram.java
public class IfElseBugProgram {
public static void main(String[] args) {
MyJFrame terminal = new MyJFrame();
while (true) {
String keyReleased = terminal.getKeyReleased();
if (! keyReleased.equals("") )
{
System.out.print("@" + keyReleased);
}
else
{
// System.out.print("!" + keyReleased);
}
}
}
}
// -----
//The code below is in file MyJFrame.java
import javax.swing.JFrame;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;
public class MyJFrame extends JFrame implements KeyListener
{
private List<KeyEvent> keyEventQueue;
public MyJFrame()
{
keyEventQueue = new ArrayList<KeyEvent>();
this.addKeyListener(this);
pack();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
public void keyPressed(KeyEvent e)
{
}
public void keyTyped(KeyEvent e)
{
}
public void keyReleased(KeyEvent keyEvent)
{
keyEventQueue.add(keyEvent);
System.out.println("some key was released!" + keyEventQueue.size());
}
我希望 if {...} 中的代码在我按下键盘上的某个键后运行。也就是说,我希望 System.out.print("@" + keyReleased);
代码在我按下一个键时立即运行。
使用版本 1,我似乎永远不会System.out.print("@" + keyReleased);
被运行;控制台中永远不会打印“@1”或“@2”或“@3”等。
对于版本 2(即 else {..} 块中的代码重新注释),
通常发生的是打印出“!”的打印语句。重复运行,直到我按下一个键。那时,诸如“@1”或“@2”之类的东西会被重复打印。
有时发生的是我没有得到“!” 也没有打印出“@1”或“@2”!(使用相同的源代码!)
问题:为什么System.out.print("@" + keyReleased);
if {..} 块中的行在版本 1 中不运行,但(通常)在版本 2 中运行?
富国沪深
潇潇雨雨
相关分类