java中VirtualKey代码的怪异行为

java中VirtualKey代码的怪异行为,java,hashmap,ascii,keyevent,awtrobot,Java,Hashmap,Ascii,Keyevent,Awtrobot,我从手机上获取键盘输入,并尝试使用robot类在计算机上显示。因为我从电话中获得了ascii,所以我有一个用于ascii到VirtualKey值转换的哈希映射。但是我现在的代码有一些奇怪的行为。当我尝试映射hashmap中的某些符号时,例如!“@当我运行它时,我得到一个NullPointer引用异常。例如,对于!手机发送正确的unicode值(33),在哈希表中我有(int)'!作为键,也是33。因此它应该返回VK_感叹号,这是它映射到的,但它返回null:(有人能帮忙吗 以下是我在查找时截取的

我从手机上获取键盘输入,并尝试使用robot类在计算机上显示。因为我从电话中获得了ascii,所以我有一个用于ascii到VirtualKey值转换的哈希映射。但是我现在的代码有一些奇怪的行为。当我尝试映射hashmap中的某些符号时,例如!“@当我运行它时,我得到一个NullPointer引用异常。例如,对于!手机发送正确的unicode值(33),在哈希表中我有(int)'!作为键,也是33。因此它应该返回VK_感叹号,这是它映射到的,但它返回null:(有人能帮忙吗

以下是我在查找时截取的代码:

int unicodekey = scanner.nextInt(); //unicode
    robotkey = ascii2VK.asciiForVirtualKey.get(unicodekey);
    robot.keyPress(robotkey);
    robot.keyRelease(robotkey);
我的hashmap如下所示:

public class ascii2VK {
      protected static final Map<Integer, Integer> asciiForVirtualKey;
            static {
                asciiForVirtualKey = new HashMap<Integer, Integer>();
                asciiForVirtualKey.put(KeyEvent.VK_UNDEFINED, 0);
                asciiForVirtualKey.put(KeyEvent.VK_QUOTE, (int)'\'');
                asciiForVirtualKey.put(KeyEvent.VK_QUOTEDBL,(int)'"');
                asciiForVirtualKey.put(KeyEvent.VK_AMPERSAND, (int)'&');
                asciiForVirtualKey.put(KeyEvent.VK_BACK_QUOTE, (int)'`');
                asciiForVirtualKey.put(KeyEvent.VK_NUMBER_SIGN, (int)'#');
                asciiForVirtualKey.put(KeyEvent.VK_EXCLAMATION_MARK, (int)'!');
                asciiForVirtualKey.put(KeyEvent.VK_AT, (int)'@');
                asciiForVirtualKey.put(KeyEvent.VK_DOLLAR, (int)'$');
                asciiForVirtualKey.put(KeyEvent.VK_BACK_SLASH, (int)'\\');
                asciiForVirtualKey.put(KeyEvent.VK_SLASH, (int)'/');
    .
    .
    .
    .
    }
公共类ascii2VK{
受保护的静态最终地图AsciForVirtualKey;
静止的{
asciiForVirtualKey=newhashmap();
asciiForVirtualKey.put(KeyEvent.VK_未定义,0);
asciiForVirtualKey.put(KeyEvent.VK_QUOTE,(int)“”);
asciiForVirtualKey.put(KeyEvent.vkquotedbl,(int)“);
asciiForVirtualKey.put(KeyEvent.VK_-AMPERSAND,(int)&');
asciiForVirtualKey.put(KeyEvent.VK_BACK_QUOTE,(int)`');
asciiForVirtualKey.put(KeyEvent.VK_数字符号,(int)#);
asciiForVirtualKey.put(KeyEvent.VK_感叹号,(int)!);
asciiForVirtualKey.put(KeyEvent.VK_AT,(int)@');
asciiForVirtualKey.put(KeyEvent.VK_-DOLLAR,(int)“$”);
asciiForVirtualKey.put(KeyEvent.VK_BACK_斜杠,(int)\\);
asciiForVirtualKey.put(KeyEvent.VK_斜杠,(int)/);
.
.
.
.
}

您应该在地图中反转键和值

KeyEvent.VK_感叹号是一个值为0x0205(517十进制)的常量。但您试图通过33代码找到它,它实际上是(int)“!”

这将是正确的订购:

asciiForVirtualKey.put((int)'!', KeyEvent.VK_EXCLAMATION_MARK);

等等。

哦,是的,我太傻了:)但除此之外,我意识到我仍然无法在屏幕上显示!到VK_键。感叹号。这只能通过按住shift键,然后按1键来完成。