是否可以在不生成大量代码的情况下提出一系列问题?

时间:2014-01-20 07:25:31

标签: java eclipse loops while-loop

我正在使用eclipse在Java中创建一个程序。该程序向用户询问一系列问题,直到他们正确回答它,它会一次又一次地询问它们,一旦得到正确的答案,它将把它存储在一个变量中供以后使用。下面是我的代码;

int waitseconds;
int favouritenumber;
int hoursofsleep;

do {
    String waitsecondsR = JOptionPane.showInputDialog("How many seconds would you like to wait for out of 1 - 7?");
    waitseconds = Integer.parseInt(waitsecondsR);
}
while (waitseconds < 1 || waitseconds > 10);

do {
    String favouritenumberR = JOptionPane.showInputDialog("What is your favourite number out of 1 and 2?");
   favouritenumber = Integer.parseInt(favouritenumberR);
}
while (favouritenumber < 1 || favouritenumber > 2);

do {
    String hoursofsleepR = JOptionPane.showInputDialog("How many hours do you sleep for? between 1-8?");
   hoursofsleep = Integer.parseInt(hoursofsleepR);
}
while (hoursofsleep < 1 || hoursofsleep > 8);

这是我用户需要回答的前三个陈述/问题,我可能会在一个类中最终得到10-12个这样的陈述,是否可以缩短这些陈述?我还有两个问题。

  1. 是否可以阻止用户输入字母答案,如果有,可能会给他们提供错误?例如如果有一个而不是1或O,那么程序应该让他们再次进入。

  2. 使用我的代码,当你运行Input Dialog时,用户必须输入答案,但如果用户单击顶部的取消或交叉图标,那么java会显示错误消息控制台,我怎么能阻止这种情况发生?像这样;

  3.   

    线程“AWT-EventQueue-0”中的异常   java.lang.NumberFormatException:null         在java.lang.Integer.parseInt(未知来源)         在java.lang.Integer.parseInt(未知来源)         在ExpressTrain.ExpressTrain(ExpressTrain.java:46)         在GUIDesign.Express(GUIDesign.java:149)         在GUIDesign $ 1.actionPerformed(GUIDesign.java:80)         在javax.swing.AbstractButton.fireActionPerformed(未知来源)         at javax.swing.AbstractButton $ Handler.actionPerformed(Unknown Source)         在javax.swing.DefaultButtonModel.fireActionPerformed(未知来源)         在javax.swing.DefaultButtonModel.setPressed(未知来源)         在javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知   资源)         在java.awt.AWTEventMulticaster.mouseReleased(未知来源)

    以及更多....

2 个答案:

答案 0 :(得分:0)

为此创建一个方法。

private static int askIntQuestion(String question, int min, int max) {
    int n = min - 1;
    do {
        try {
            String input = JOptionPane.showInputDialog(question);
            n = Integer.parseInt(input);
        } catch (NumberFormatException e) {
        }
    } while (n < min || n > max);
    return n;
}

然后致电:

int waitseconds = askIntQuestion("How many seconds would you like to wait for out of 1 - 7?", 1, 7);

如您所知,do-while强制有效范围。现在,try-catch的目的是捕获当输入不是数字或没有输入时显示在控制台中的异常。使用n初始化min - 1变量,以确保在给出非数字输入时它不会退出循环。最后,将所有这些内容包含在方法中会使您在外部使用更加容易,就像通过调用看到的一样。

如果您愿意,可以更改代码以在用户输入错误信息时通知用户:

private static int askIntQuestion(String question, int min, int max) {
    while (true) {
        try {
            String input = JOptionPane.showInputDialog(question);
            int n = Integer.parseInt(input);
            if (n >= min && n <= max) return n;
        } catch (NumberFormatException e) {
        }
        JOptionPane.showInputDialog("You should input a number between " + min + " and " + max + ".");
    }
}

这里我们不需要初始化为min - 1的技巧,因为while确保退出的唯一方法是在return指令中,只有当输入是有效。否则它会显示错误消息和循环。

答案 1 :(得分:0)

首先,您可能希望将问题存储在外部文件或数据库中,这样它们就不会使代码混乱。您可以从文件中读取一行并将其视为一个问题。

现在,如果你必须有针对它的特定验证逻辑,你需要编写一些代码以确保你有正确的验证来解决正确的问题,但是我想它会有所不同。这个:

BOUND 1,8 How many hours do you sleep for? between 1-8?

...文件中包含约束类型的enum,限制用逗号分隔,以及实际问题。

我不会为您设计解决方案,但我强烈建议您更好地提出适合您和您对Java的理解。

接下来,Integer#parseInt()的工作方式是它将尝试将输入解析为整数,或者如果它不是远程数字(即"$")则将天空向上吹。

炸毁实际上很容易恢复 - 您可以使用try...catch声明  从该方法恢复无法将输入转换为Integer,以及无限循环以在未正确解析答案时继续询问输入:

while(true) {
    try {
        Integer waitseconds = Integer.parseInt(JOptionPane.showInputDialog("How many seconds would you like to wait for out of 1 - 7?"));
        if(waitseconds < 1 || waitseconds > 10) {
            break;
        }
    } catch (NumberFormatException nfe) {
        JOptionPane.showMessageDialog(null, "Invalid input; please try again.");
    }
}

您的上一个问题:错误是您输入对话框中没有输入任何内容的结果,因此当它返回到程序时,您会得到这些异常。您可以在尝试解析整数之前添加空检查,这无论如何都是明智的。