Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Newb:递归循环后未重新分配返回参数_Java_Return - Fatal编程技术网

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

Java Newb:递归循环后未重新分配返回参数,java,return,Java,Return,输入几个无效条目后,返回的参数没有使用有效条目重新分配。输出示例: static String ask(String question) { String Answer = JOptionPane.showInputDialog(question); Answer = Answer.toUpperCase(); System.out.println("User, " + counter +"," + Answer); // for de

输入几个无效条目后,返回的参数没有使用有效条目重新分配。输出示例:

    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

如您所见,“U”是第一个条目,而最后一个“A”是逃离循环的条目。虽然返回的是“U”,而不是“A”。但我不知道为什么?

正如Ivar在评论中所说,您没有在switch语句的
默认部分返回答案。你需要说
return ask(question
,而不是仅仅调用
ask(question)
。然后,底部的
return-answer
部分就不需要了。请看下面的代码(我也对它做了一些修改,使它看起来更美观)

您应该意识到,当您再次调用该方法时,return语句仅从上次的方法调用返回。因此,在您最初的方法调用中,
ask(question)
的结果被忽略(实际上就像调用一个void方法).Return语句不会返回到堆栈中的第一个方法。这就是为什么在默认值中需要返回

User, 1,U
User, 2,I
User, 3,O
User, 4,P
User, 5,M
User, 6,A
User Answer:U
CorrectAnser:A
false
变成一个循环,这将是:

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)
        }
}
假设您有一个函数,它接受两个字符串,对它们进行散列,然后如果第一个字符串的散列码大于第二个字符串的散列码,则返回true

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;

如您所见,当您第一次调用
hash
方法并返回一个
int
时,这并不意味着
compareHashCodes
也会立即返回一个int。它只会将该int存储到变量
hash1
中。第二次,当您将hashCode放入
hash2
中时,也会发生同样的情况ird时间,
hash(s1)的值
被忽略,而不是返回,因为从一个isi应该返回布尔值的方法返回INT是没有意义的。只有当到达最终语句
return hash1>hash2
时,方法
compareHashCodes
才实际返回。

您没有对在递归中返回的值执行任何操作rsive call.
return ask(question)
。如果您不需要返回答案,那么您的方法将type返回为void。您的代码风格一开始就让我感到不舒服。请查看标准Java编码风格建议:-变量名称应以小写字母开头(答案-非答案)您不需要用括号括住返回:return-answer;-只是一个帮助注释。最后一个返回是必需的,因为您声明了要返回字符串的方法。您可能会在switch语句中输入默认值,但不返回任何内容,Java编译器也会要求您有一个返回语句仍在swtich块之外。不应到达最后一个返回,每种情况都有一个返回语句,默认情况下是递归。
返回询问(问题)
正在将问题发送回方法以获取新的有效输入…我可能语法不正确,这就是我要问的。好的,我想我开始理解了…我理解递归函数调用的工作方式类似于循环,会再次启动整个函数,但我缺少的是它会从m默认,并保持默认状态,等待进一步的指令,因此需要返回。@denver coder-
public boolean compareHashCodes(String s1, String s2) {
  int hash1 = hash(s1), hash2 = hash(s2);
  hash(s1);
  return hash1 > hash2;
}

public int hash(String s) {
  return s.hashCode(); //or something else
}