Java Newb:递归循环后未重新分配返回参数

问题描述 投票:0回答:1
    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”。不知道为什么吗?

java return
1个回答
1
投票

正如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;
© www.soinside.com 2019 - 2024. All rights reserved.