【问题标题】:does not loop and display the error message不循环并显示错误消息
【发布时间】:2012-03-24 01:34:47
【问题描述】:

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

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

【问题讨论】:

  • 我已根据样式格式化了您的代码,因此更易于阅读。 (除了空格没有变化。)

标签: java while-loop try-catch joptionpane


【解决方案1】:

似乎绝对无法进入while(hasDigit) 循环,因为您将其设置为false,而没有将其设置为true。

【讨论】:

  • 我忘记了是什么让我回到了这个问题,但我想只要我在这里,我还不如离开露营地比我找到它时更干净。 :-)
【解决方案2】:

一个问题是 hasDigit 的值将始终保持为假。您最初可能希望将 hasDigit 定义为 true。

boolean hasDigit = true;

【讨论】:

  • 哦,是的,很抱歉。没看到那个。我已经编辑太多了。 :)) 无论如何,它现在会显示错误消息,但是,它会进入密码对话框。我希望它回到名称对话框。
  • 好吧,在 catch 块中设置 name="" 就可以了。
  • 谢谢!有效。 :) 我刚接触 Java,这就是我问这些问题的原因。感谢您的帮助:)
  • 没问题。我们曾经都是 Java 新手 :)
【解决方案3】:

既然你问了一些关于风格的问题:

  • 一般来说,您希望 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 块几乎相同(它们提示输入非空字符串),请考虑将它们提取到辅助函数中。您需要传递指定提示以及是否将输入回显给用户的参数。

【讨论】:

    猜你喜欢
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2014-11-30
    • 1970-01-01
    • 2015-04-25
    • 2011-09-17
    • 1970-01-01
    相关资源
    最近更新 更多