1

下面是我的 Java 代码。如果用户输入的数字不等于1该方法getInput()将被再次调用。

public void getInput(){
int i=0;
    while(i<=4){
        result[i] = Integer.parseInt(JOptionPane.showInputDialog("Enter Result (1 = pass, 2 = fail)"));
        int res = result[i];
        if(res!=1){
            JOptionPane.showMessageDialog(null,"Wrong input, please try again!");
            System.out.println("Wrong Input:" + res);
            getInput();
        }
        System.out.println("count:"+i);
        i=i+1;
    }
}

以下是代码产生的结果

  • count:0 <- 从 0 开始计数
  • 计数:1
  • 错误输入:2 <- 输入错误的输入并getInput()再次调用方法。
  • count:0 <- 从 0 开始计数
  • 计数:1
  • 计数:2
  • 计数:3
  • 计数:4
  • count:2 <- 从 2 重新开始
  • 计数:3
  • 计数:4

问题是计数器工作不正常。有人可以帮我解决这个问题吗?为什么会这样?

4

2 回答 2

4

每次调用getInput()设置的方法时i = 0,尝试将计数器作为方法参数传递:

public void getInput(int i){
    while(i<=4){
        result[i] = Integer.parseInt(JOptionPane.showInputDialog("Enter Result (1 = pass, 2 = fail)"));
        int res = result[i];
        if(res!=1){
            JOptionPane.showMessageDialog(null,"Wrong input, please try again!");
            System.out.println("Wrong Input:" + res);
            getInput();
        }
        System.out.println("count:"+i);
        i=i+1;
    }
}

我不会为此目的使用递归调用,为什么不这样做:

public void getInput(){      
  while(i<=4) && ((res = Integer.parseInt(JOptionPane.showInputDialog("Enter Result (1 = pass, 2 = fail)"))) != 1){        
      JOptionPane.showMessageDialog(null,"Wrong input, please try again!");
      System.out.println("Wrong Input: " + res);          
      i = i + 1; 
    }
    System.out.println("count:" + i);        
  }
}
于 2013-04-11T10:18:54.713 回答
1

getInput()从内部调用开始递归。递归方法调用完成后,将在调用站点恢复执行,并且(假设没有副作用)与递归调用之前的状态相同。

因此,如果您的用户输入 2 您getInput()递归调用,并且一旦此“内部”执行成功完成(即用户输入 1 四次),“内部”getInput()返回并且外部以与以前完全相同的状态恢复(您的计数变量在本地声明!)。

我建议不要在这里使用递归,而是使用更简单的 if/else 构造并更改变量i以保持状态:

while (i <= 4) {
   // input code here
   if  (res != 1) {
      // fail message for user here
      i = 0;
   } else {
      // success message for user here
      i++;
   }
}

请注意,此方法可能会使用户感到沮丧,应添加取消执行的选项(:

于 2013-04-11T10:24:23.017 回答