【问题标题】:Send Keyboard Outputs发送键盘输出
【发布时间】:2020-03-28 20:49:22
【问题描述】:

我想创建一个键盘输出 API 类型的东西,这样我就可以为俄罗斯方块制作一个机器学习程序,我尝试了:

import java.awt.*;

public class Keyboard
{
    public static void main( String[] args )
    {
        Robot keyboard = new Robot();
        keyboard.keyPress(KeyEvent.VK_A);

    }

}

但它对new Robot() 有一个错误,它显示“未处理的异常:java.awt.AWTException”。并且在那之后它有一个错误:“无法解析符号'KeyEvent'”,即使我有import java.awt.*;。我做错了什么?

【问题讨论】:

  • Star-imports 不导入“子包”(因为那些在技术上不存在)。而KeyEvent 类在java.awt.event.KeyEvent 中。所以它不在您的导入范围内。关于您的new Robot,这是一个检查异常。因此,您必须尝试捕获它或添加声明throws。这是一个相当基本的问题,您只需阅读有关异常的教程即可轻松解决。

标签: java exception import awt


【解决方案1】:

让我们检查一下我们得到了什么错误。

Unhandled exception: java.awt.AWTException

这意味着你不处理调用构造函数new Robot();引发的异常 您需要在此处的文档中检查这一点: https://docs.oracle.com/javase/7/docs/api/java/awt/Robot.html 或使用您的 IDE,它可以显示可以抛出哪个异常。 为了解决这个问题,我们需要用 try-catch 块包围构造函数调用 new Robot (); 或在方法 main() 中声明异常抛出; 更多关于异常的信息:https://docs.oracle.com/javase/tutorial/essential/exceptions/

Cannot resolve symbol 'KeyEvent'

这可能意味着您在导入 import java.awt.* 的情况下缺少一些导入;但是这个导入不包括java.awt.event

//Don't use static (*) import just import what you need in this case
//or use your IDE auto import

import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.AWTException;

 public class MainClass {

   public static void main(String[] args) {

    try {
        Robot rob = new Robot();
        // Robot can throw an AWTException
        // we need surround him with try-catch block
        // Or declare exception throw in current method

        // Pressing button
        rob.keyPress(KeyEvent.VK_A);

        // Releasing button in case if we don't do that key may stay in press state
        rob.keyRelease(KeyEvent.VK_A);
    } catch (AWTException e) {
        // Process exception if something go wrong
        e.printStackTrace();
    }

}

【讨论】:

  • @Zabuza 更好?
  • @Zabuza:是的,更好,1+
  • 如果我将 catch 留空会发生什么,例如 try { Robot keyboard = new Robot(); keyboard.keyPress(KeyEvent.VK_A); } catch ( AWTException e ) { } 抱歉格式化它不会让我在评论中直接换行
  • @Nightmare FNaF 很好,但如果执行已被抛出,您不会在控制台中看到消息。我真的推荐使用 e.printStackTrace();它可以让您查看代码中发生了什么以及发生的位置(行号、方法等)
猜你喜欢
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多