Java计数器无法正常工作

时间:2013-04-11 10:13:17

标签: java loops methods counter

以下是我的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&lt; - 从0开始计数
  • 数:1
  • 错误的输入:2&lt; - 输入错误的输入并再次调用方法getInput()
  • count:0&lt; - 从0开始计数
  • 数:1
  • 数:2
  • 数:3
  • 数:4
  • count:2&lt; - 从2
  • 再次开始
  • 数:3
  • 数:4

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

2 个答案:

答案 0 :(得分: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);        
  }
}

答案 1 :(得分:1)

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

因此,如果您的用户输入2,则递归调用getInput(),一旦此“内部”执行成功完成(即用户输入1次4次),“内部”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++;
   }
}

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