2013-04-11 2 views
1

Ниже приведен код Java. Если пользователь вводит номер, который не равен 1, метод getInput() будет вызываться снова.Счетчик Java неправильно работает

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; 
    } 
} 

Ниже приведены результаты производства по коду

  • Количество: 0 < - начинает отсчет от 0
  • Количество: 1
  • Неправильный вход: 2 < - Введите неправильный ввод и вызов метод getInput() еще раз.
  • Количество: 0 < - таймер начинает отсчет от 0
  • Количество: 1
  • Количество: 2
  • Количество: 3
  • Количество: 4
  • Количество: 2 < - снова начинается от 2
  • Количество: 3
  • Количество: 4

Проблема в том, что счетчик работает неправильно. Может кто-то, пожалуйста, помогите мне решить эту проблему и почему это происходит?

ответ

1

Вызов getInput() изнутри сам по себе начинается рекурсия. После того как вызов рекурсивного метода будет завершен, выполнение будет возобновлено на вызывающем сайте и (при условии отсутствия побочных эффектов) с тем же состоянием, что и перед рекурсивным вызовом.

Поэтому, если пользователь вводит 2 вы называете getInput() рекурсивно, и как только это «внутреннее» выполнение завершается успешно (т.е. пользователь ввел 1 четыре раза), «внутренний» getInput() возвращается и внешний один возобновляется точно так же, как и раньше (ваша переменная count объявлена ​​локально!).

Я бы предложил не использовать рекурсию здесь, но более простой, если/иначе построить и изменить переменную i для поддержания состояния:

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

Обратите внимание, что этот метод может расстроить пользователя, возможность отменить выполнение должно быть добавлено (:

+0

Количество: 0 Неправильный вход: Количество: 0 Количество: 1 Количество: 2 Количество: 3 количество: 4 кол-во: 1 кол-во: 2 кол-во: 3 кол-во: 4 - это результаты, которые я получил при реализации вышеуказанного кода. Цикл while работает дважды. –

+0

Вы удалили вызов 'getInput()' в if-условии? Похоже, вы все еще возвращаетесь в свой метод. – Pyranja

+0

Спасибо Prynja !! устранение рекурсивного вызова устраняет проблему. :) –

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);   
    } 
} 
+0

Я пробовал это, и он не исправил проблему :('getInput (0);' передал значение параметра 0 методу внутри условия if. –

+0

Вам нужно увеличить i до вызова функция recursevley – CloudyMarble

+0

Я вас не понял. Можете ли вы отредактировать код и показать, пожалуйста? –

Смежные вопросы