Java 为什么';我的方法不能用于字母枚举吗?

Java 为什么';我的方法不能用于字母枚举吗?,java,keyboard,Java,Keyboard,我正在尝试为java游戏编写一个动态键绑定系统。它基本上是有效的,除了一个大问题:像a,b,c这样的字符不起作用。只有像~,&,$这样的字符才能工作 我使用KeyFinder lookup=KeyFinder.lookup(keyChar)调用该方法 这是我当前的代码文件,如果太长了,很抱歉 KeyFinder.java 公共枚举键查找器{ A(键盘按键A,“A”,“A”), B(键盘按键B,“B”,“B”), C(键盘按键C,“C”,“C”), D(键盘键,D,D), E(键盘上的键E,“E”

我正在尝试为java游戏编写一个动态键绑定系统。它基本上是有效的,除了一个大问题:像
a
b
c
这样的字符不起作用。只有像
~
&
$
这样的字符才能工作

我使用
KeyFinder lookup=KeyFinder.lookup(keyChar)调用该方法

这是我当前的代码文件,如果太长了,很抱歉

KeyFinder.java
公共枚举键查找器{
A(键盘按键A,“A”,“A”),
B(键盘按键B,“B”,“B”),
C(键盘按键C,“C”,“C”),
D(键盘键,D,D),
E(键盘上的键E,“E”,“E”),
F(键盘键,F,“F”,“F”),
G(键盘键,G,“G”,“G”),
H(键盘键,H,“H”,“H”),
I(Keyboard.KEY_I,“I”,“I”),
J(Keyboard.KEY_J,“J”,“J”),
K(键盘键,K,“K”,“K”),
L(键盘键,L,“L”,“L”),
M(键盘键,M,“M”,“M”),
N(键盘键N,“N”,“N”),
O(键盘按键O,“O”,“O”),
P(键盘键P,“P”,“P”),
Q(键盘键,Q,“Q”,“Q”),
R(键盘键,R,“R”,“R”),
S(Keyboard.KEY_S,“S”,“S”),
T(键盘键,T,T),
U(键盘键,U,“U”,“U”),
V(键盘键,V,“V”,“V”),
W(键盘键W,“W”,“W”),
X(键盘键X,“X”,“X”),
Y(键盘按键Y,“Y”,“Y”),
Z(键盘键,Z,“Z”,“Z”),
波浪线(Keyboard.KEY_GRAVE,“~”,“`”),
选项卡(Keyboard.KEY_选项卡,“选项卡”),
F1(键盘键_F1,“F1”),
F2(键盘键F2,“F2”),
F3(键盘键_F3,“F3”),
F4(键盘键u F4,“F4”),
F5(键盘键F5,“F5”),
F6(键盘键+F6,“F6”),
F7(键盘上的键)u F7,“F7”),
F8(键盘键_F8,“F8”),
F9(键盘键\ F9,“F9”),
F10(键盘按键,F10,“F10”),
F11(键盘键,F11,“F11”),
F12(键盘键,F12,“F12”),
F13(键盘键,F13,“F13”),
F14(键盘键,F14,“F14”),
F15(键盘键,F15,“F15”),
一个(键盘键1,1,“!”,“一”),
两个(键盘键2,2,“@”,“2”),
三个(键盘键3,“3”,“3”,“3”),
四个(键盘键4,“4”,“美元”,“四”),
五个(键盘键5、5、“%”和“五”),
六个(键盘键6,6,“^”,“六”),
七个(键盘键7,7,“&”,“七”),
八个(键盘键8,“8”,“8”,“*”,“8”),
九(键盘键9,9,“(,“九”),
零(键盘键0,“0”,“零”),
减号(Keyboard.KEY_减号、“-”、“_”、“减号”),
等于加(键盘键等于,“=”、“+”、“加”、“等于”),
插入(键盘键插入,“插入”,“插入”),
DEL(Keyboard.KEY_DELETE,“DEL”,“DELETE”),
主页(Keyboard.KEY_HOME,“主页”),
添加(Keyboard.KEY_添加,“添加”),
翻页(键盘键前,“前”,“翻页”),
向下翻页(键盘键“下一步”、“下一步”、“向下翻页”),
NUM_LOCK(Keyboard.KEY_NUMLOCK,“NUMLOCK”,“numberlock”),
左方括号(Keyboard.KEY_LBRACKET,“[”,“{”),
SQBRACKET_RIGHT(Keyboard.KEY_RBRACKET,“]”,“}”),
分号(Keyboard.KEY_分号“;”,“:”;
私有静态最终映射键=new HashMap();
私有静态最终映射查找=新建LinkedHashMap();
私钥;
私有最终字符串键名;
私有最终字符串[]查找键;
静止的{
for(KeyFinder类型:EnumSet.allOf(KeyFinder.class)){
keys.put(type.key,type);
for(字符串键:type.lookupKeys){
lookup.put(键,类型);
}
}
}
KeyFinder(int键、String键名、String查找键){
this.key=key;
this.keyName=keyName;
this.lookupKey=新字符串[]{lookupKey};
}
KeyFinder(整型键、字符串键名、字符串…查找键){
this.key=key;
this.keyName=keyName;
this.lookupKeys=lookupKeys;
}
公共静态键查找器fromKey(int key){
返回键。获取(键);
}
公共静态字符串toKeyName(int键){
KeyFinder类型=keys.get(键);
if(type!=null){
返回类型:getKeyName();
}否则{
返回“#”+键;
}
}
公共静态键查找器查找(字符串keyName){
返回查找(keyName,true);
}
公共静态键查找器查找(字符串键名,布尔模糊){
KeyFinder i=StringUtil.lookup(查找,键名,模糊);
如果(i!=null)
返回i;
其他的
试一试{
返回fromKey(Integer.parseInt(keyName));
}捕获(数字格式){
返回null;
}
}
public int getKey(){
返回键;
}
公共字符串getKeyName(){
返回键名;
}
}

您的问题是无法减少问题,因为您的代码太复杂(=它有太多依赖项)

尝试将代码分成独立的位和段,并为每个位和段编写单元测试。如果单元测试有效,那么您将知道任何bug只能隐藏在连接不同部分的代码中


这就是说,我的猜测是,某个方法返回
null
,而您编写的代码在这种情况下以静默方式失败(即,不是给出错误消息“此处不应返回null”,而是放弃)。像这样的代码是非常不友好的,因为任何不寻常的情况都会使它在没有任何线索的情况下悄无声息地失败,让试图理解发生了什么的人(在本例中是你).

我剥去了你的
KeyFinder
并与
StringUtil
一起测试,意识到你从来没有在
查找
地图中使用过
keyName
。所以
a
不存在

以下是我所做的一些改变,可能会对您有所帮助

查找键
更改为列表而不是数组

private final ArrayList<String> lookupKeys = new ArrayList<String>();
更改另一个构造函数,并让
keyName
包含在
lookupKeys

KeyFinder(int key, String keyName, String... lookupKeys) {
    this.key = key;
    this.keyName = keyName;
    this.lookupKeys.add(keyName);
    this.lookupKeys.addAll(Arrays.asList(lookupKeys));
}
它在一些简单的测试中对我有效

NB

我没有更多地分析你的代码
KeyFinder(int key, String keyName, String lookupKey) // Remove
KeyFinder(int key, String keyName, String... lookupKeys) {
    this.key = key;
    this.keyName = keyName;
    this.lookupKeys.add(keyName);
    this.lookupKeys.addAll(Arrays.asList(lookupKeys));
}