不循环并显示错误消息

时间:2012-03-24 01:34:47

标签: java while-loop try-catch joptionpane

好的,我有这个代码要求输入用户名和密码。我用了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);
    }
  }
}

请在我的代码中提及有关其他行的任何注释,以及是否有任何不必要的行。提前谢谢你:)

3 个答案:

答案 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块来包围代码。

  • 无需将namepw设置为if()内的空字符串,以测试它们是否为空。

  • 您可能不想回显密码。请参阅JOptionPane to get password

  • 代码明确禁止name中的数字,但接受所有其他字符,包括标点符号和特殊字符。使用可接受输入的白名单通常是良好的编程习惯,而不是禁止输入的黑名单。这样,您就不会对意外接受的无效数据感到惊讶。

  • 如果密码无效,则最外面的while()循环将退出,因为input仅取决于name。最好在循环顶部将input设置为false,如果输入无效,则将其设置为true

  • 由于namepw块几乎相同(它们提示输入非空字符串),因此请考虑将它们提取到辅助函数中。您需要传递指定提示的参数以及是否将输入回送给用户。