我正在使用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或O,那么程序应该让他们再次进入。
使用我的代码,当你运行Input Dialog
时,用户必须输入答案,但如果用户单击顶部的取消或交叉图标,那么java会显示错误消息控制台,我怎么能阻止这种情况发生?像这样;
线程“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(未知来源)
以及更多....
答案 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.");
}
}
您的上一个问题:错误是您输入对话框中没有输入任何内容的结果,因此当它返回到程序时,您会得到这些异常。您可以在尝试解析整数之前添加空检查,这无论如何都是明智的。