好的,我有这个代码要求输入用户名和密码。我用了JOptionPane
。我想要的程序是,如果用户名字段上的输入有一个数字,则显示错误消息,然后返回上一个对话框,再次询问用户名。我有这个while循环但它不能正常运行。请帮忙。程序不会在我的catch
方法上显示错误消息,也不会循环显示对话框。
public class SwingExercise {
public static void main(String[] args) {
String name = "";
String pw = "";
boolean input = true;
boolean hasDigit = false;
while (input) {
try {
while (name.equals("")) {
name = JOptionPane.showInputDialog(null, "Enter username:");
if (name.equals("")) {
JOptionPane.showMessageDialog(
null, "No input.", "Error", JOptionPane.ERROR_MESSAGE);
name = "";
}
while (hasDigit) {
for (int i = 0; i < name.length(); i++) {
if (Character.isDigit(name.charAt(i))) {
throw new InputMismatchException();
}
}
hasDigit = false;
}
}
input = false;
while (pw.equals("")) {
pw = JOptionPane.showInputDialog(null, "Enter password:");
if (pw.equals("")) {
JOptionPane.showMessageDialog(
null, "No input.", "Error", JOptionPane.ERROR_MESSAGE);
pw = "";
}
}
} catch (NullPointerException e) {
System.exit(0);
} catch (InputMismatchException e) {
JOptionPane.showMessageDialog(
null, "Invalid input.", "Error", JOptionPane.INFORMATION_MESSAGE);
}
}
}
请在我的代码中提及有关其他行的任何注释,以及是否有任何不必要的行。提前谢谢你:)
答案 0 :(得分:1)
似乎绝对没有办法进入while(hasDigit)
循环,因为您已将其设置为false
,并且没有任何内容将其设置为true
。
答案 1 :(得分:0)
一个问题是hasDigit的值将始终为false。您可能希望最初将hasDigit定义为true。
boolean hasDigit = true;
答案 2 :(得分:0)
关于风格的一些评论,因为你问:
一般情况下,您希望try()
块尽可能短,因此您可以清楚地知道哪些行会引发异常。否则,您可能会意外地从您认为无法生成它的行中捕获异常,然后错误地处理它。这意味着代码可能会更长,但更容易维护和调试更为重要。
如果字符串为null
是合法的,那么编写if ("".equals(name))
而不是if (name.equals(""))
是很常见的。由于硬编码的空字符串永远不会是null
,因此您无需使用try
/ catch
块来包围代码。
无需将name
或pw
设置为if()
内的空字符串,以测试它们是否为空。
您可能不想回显密码。请参阅JOptionPane to get password。
代码明确禁止name
中的数字,但接受所有其他字符,包括标点符号和特殊字符。使用可接受输入的白名单通常是良好的编程习惯,而不是禁止输入的黑名单。这样,您就不会对意外接受的无效数据感到惊讶。
如果密码无效,则最外面的while()
循环将退出,因为input
仅取决于name
。最好在循环顶部将input
设置为false
,如果输入无效,则将其设置为true
。
由于name
和pw
块几乎相同(它们提示输入非空字符串),因此请考虑将它们提取到辅助函数中。您需要传递指定提示的参数以及是否将输入回送给用户。