我试图让我的程序检查播放器输入的名称,看它是否使用任何无效字符。在我看来,如何让它工作似乎是有道理的,但它似乎不适用于实际环境。当我运行它,并且我使用无效字符时,它将继续执行程序的下一部分。关于如何解决它的任何想法?
这是我的相关代码块:
if (!(nameInput.getText().equals(""))) {
boolean allow = true;
String check = nameInput.getText();
for (int i = 0;i>check.length();i++) {
if (check.charAt(i) == '`' || check.charAt(i) == '~' ||
check.charAt(i) == '!' || check.charAt(i) == '@' ||
check.charAt(i) == '#' || check.charAt(i) == '$' ||
check.charAt(i) == '%' || check.charAt(i) == '^' ||
check.charAt(i) == '&' || check.charAt(i) == '*' ||
check.charAt(i) == '(' || check.charAt(i) == ')' ||
check.charAt(i) == '_' || check.charAt(i) == '+' ||
check.charAt(i) == '=' || check.charAt(i) == '[' ||
check.charAt(i) == ']' || check.charAt(i) == '{' ||
check.charAt(i) == '}' || check.charAt(i) == ';' ||
check.charAt(i) == '\''|| check.charAt(i) == ':' ||
check.charAt(i) == '"' || check.charAt(i) == '<' ||
check.charAt(i) == '>' || check.charAt(i) == '?' ||
check.charAt(i) == ',' || check.charAt(i) == '.' ||
check.charAt(i) == '/' || check.charAt(i) == '\\'||
check.charAt(i) == '|' || check.charAt(i) == '1' ||
check.charAt(i) == '2' || check.charAt(i) == '3' ||
check.charAt(i) == '4' || check.charAt(i) == '5' ||
check.charAt(i) == '6' || check.charAt(i) == '7' ||
check.charAt(i) == '8' || check.charAt(i) == '9' ||
check.charAt(i) == '0') {
allow = false;
}
}
if (allow == true) {
player = new Player(check);
window.refresh();
mainMenu();
} else {
JOptionPane.showMessageDialog(window, "Invalid Name(Uses invalid Characters","Invalid!", JOptionPane.OK_OPTION);
}
} else {
JOptionPane.showMessageDialog(window, "Can Not Leave Name Blank!", "Missing Name!", JOptionPane.OK_OPTION);
window.refresh();
createPlayer();
}
}
答案 0 :(得分:5)
for(int i = 0;i>check.length();i++)
我永远不会输入您的for
循环,因为我不相信String
的长度可能会消极...
您的意思是使用<
吗?
此外,还有显着更好的方法来检查有效名称,而不是一个巨大的字符检查链。
一种方法是使用正则表达式;查看Java的Pattern课程和Google学习正则表达式。这样你就可以减少你的循环和if-block(我想;我只是接受了字母字符,并且基于对怪物的快速浏览而拒绝了其他所有内容):
allow = String.matches("[a-zA-Z]{1,}");
答案 1 :(得分:1)
如果你真的有兴趣只允许包含不在该列表中的字符的字符串,你可以使用这样的正则表达式。
allow = check.matches("[^]`~!@#$%^&*()_+=[{};':\"<>?,./\\\\|1234567890]*");
如果allow
完全由不在列表中的字符组成,则会将true
设置为check
。
请注意,我将^
放在[
内 - 这意味着“不是”。我还将]
移到^
之后,以便在关闭列表时不会将其解释为。
答案 2 :(得分:0)
更改
for(int i = 0;i>check.length();i++)
到
for(int i = 0;i<check.length();i++)
由于i为0,明显少于check.length()
程序流从未真正进入for循环。
另外,只需检查""
添加空检查。
if(nameInput.getText()!=null && !(nameInput.getText().equals(""))){..}