static String ask(String question) {
String Answer = JOptionPane.showInputDialog(question);
Answer = Answer.toUpperCase();
System.out.println("User, " + counter +"," + Answer); // for debugging purposes
counter += 1; // for debugging purposes
switch (Answer){
case "A":
return(Answer);
case "B":
return(Answer);
case "C":
return(Answer);
case "D":
return(Answer);
case "E":
return(Answer);
default:
JOptionPane.showMessageDialog(null, "Invalid Answer. Please Enter A,B,C,D,or E:");
ask(question);
// when invalid option entered, we loop back to beginning of method - Answer not being reassigned
}
return(Answer); // I don't need this, Java won't let me run without it
输入一些无效条目后,返回的参数未与有效条目重新分配。输出示例:
User, 1,U
User, 2,I
User, 3,O
User, 4,P
User, 5,M
User, 6,A
User Answer:U
CorrectAnser:A
false
如您所见,“ U”是第一个条目,最后一个-“ A”是逃避循环的条目。虽然返回的是“ U”,而不是“ A”。不知道为什么吗?
正如Ivar在评论中所说,您不会在switch语句的default
部分中返回答案。您需要说return ask(question
而不是只调用ask(question)
。然后,底部的return answer
部分将是不必要的。请参见下面的代码(我也对其进行了一些修改,以使其看起来更美观)。
您应该意识到,当再次调用该方法时,return语句仅从最后一个方法调用返回。因此,在您原始的方法调用中,ask(question)
的结果将被忽略(实际上就像调用void方法一样)。 Return语句不会返回到堆栈中的第一个方法。这就是为什么您需要默认值的退货。
static String ask(String question) {
String answer = JOptionPane.showInputDialog(question).toUpperCase();
System.out.println("User, " + counter +"," + answer); // for debugging purposes
counter += 1; // for debugging purposes
switch (answer) {
case "A":
case "B":
case "C":
case "D":
case "E":
return answer;
default:
JOptionPane.showMessageDialog(null, "Invalid Answer. Please Enter A,B,C,D,or E:");
return ask(question);
// when invalid option entered, call method again (btw, you're not looping back, it's just recursion)
}
}
变成一个循环,它将是:
static String ask(String question) {
String result = question;
do {
String answer = JOptionPane.showInputDialog(question).toUpperCase();
switch (answer) {
case "A":
case "B":
case "C":
case "D":
case "E":
result = answer;
break;
default:
JOptionPane.showMessageDialog(null, "Invalid Answer. Please Enter A,B,C,D,or E:");
}
} while (result == question); //I know, I know, I'm using "==". But it should be fine because question is assigned to it at the start
return result;