我在封闭范围内定义的局部变量

时间:2019-07-19 22:52:53

标签: java

我正在编写一个程序,其中按F4 将连续按键盘上的某个键,直到您按下另一个键(F2)

public ViewPotion() {
        int i = 0;
        addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent event) {

                if (event.getKeyCode() == KeyEvent.VK_F4) {
                    System.out.println("Iniciando AutoPotion");
                     i = 1;
                    new Thread() {
                        @Override
                        public void run() {
                            try {
                            while (i > 0) {
                                    Robot robot = new Robot();
                                    robot.keyPress(KeyEvent.VK_O);
                                }
                            } catch (AWTException e) {
                                e.printStackTrace();
                            }
                        }
                    }.start();
                }

                if (event.getKeyCode() == KeyEvent.VK_F2) {
                    System.out.println("Parando AutoPotion");
                   i = 0;
                }
            }
        }); 


        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
    }

}

但是我得到了错误:

  

我在封闭范围内定义的局部变量必须是最终的或实际上是最终的

1 个答案:

答案 0 :(得分:1)

您在getAttribute()块之外定义了i。这里的问题是keyPressed方法不会在之后立即调用,因此keyPressed必须为i,这样您才不会意外地在两个线程之间同时修改变量。

这里的一种解决方案是使final成为全局变量(方法之外)。这样,就可以从多个线程进行访问,并且在i完成时也不会超出范围。


您还可以通过使用布尔值来显着清理代码

ViewPotion