После перезапуска программы с while l oop метод исключения не работает - PullRequest
1 голос
/ 23 апреля 2020

Я обрабатываю исключения для упражнения и работает нормально до тех пор, пока я не введу недопустимый номер (для попытки) после первого запуска программы, это после первого запуска, когда запрашивается повторный запуск с другими значениями, если я случайно ввести недопустимые значения, он не выдаст исключение, и я не знаю почему? Это то, чего я не знаю, или это мой код? Спасибо

//program  ReverseNumbers.java
//This program reverses the digits of each number in an array.
import java.util.Scanner;
public class ReverseNumbers{
   public static void main(String[] args){

     Scanner input = new Scanner(System.in); 
     int[] numbers  = new int[5]; //create array numbers size 5
     boolean continueInput = true; //controls loop for input
     String another = "y";

      while(another.equalsIgnoreCase("Y")){ //loop to re-run program

         do{
            System.out.print("\nEnter 5 positive integers: "); //prompt the user to enter 5 integers

         //try block 
            try{
               for(int i = 0; i < numbers.length ; i++)  //initialize the array
                  numbers[i] = input.nextInt();

               checkInput(numbers); //handler method

               continueInput = false;

            }

            //catch block
            catch(IllegalArgumentException ex){
               System.out.print("\nInvalid input: ");
               //input.nextLine();
            }


         }while(continueInput);


      //outputs

         System.out.print("\nEntered numbers:\t\t");
         for(int e: numbers)
            System.out.print(e + " ");

         System.out.print("\nReversed numbers:\t\t");
         reverse(numbers); 

      //output re-run program
         System.out.println();
         System.out.print("\nRe-run program with different values, Y/N? ");
         another = input.next();


      }

   }

  //Exception method 
   public static void checkInput(int[] array) throws IllegalArgumentException {
      for(int i = 0; i < array.length; i++){
         if(array[i]<0)
            throw new IllegalArgumentException();
      }    


   }


//method reverse. 
   public static void reverse(int[] array) {

   //reverse order of element within the array
      int i, k, t;
      int n = array.length;
      for (i = 0; i < n / 2; i++) { 
         t = array[i]; 
         array[i] = array[n - i - 1]; 
         array[n - i - 1] = t; 
      } 

      reverse(array, array.length-1);
   }

//helper method   
   public static void reverse(int[] array, int n){  //reverse the order of the number for each element in the array
                                                    // n, number of elements in the array  
      if(n>=0){  
         int Element = array[n]; //element n in array 
         int NewElement = -1;
         int Digit = -1;
         String s = "";

         if(Element<10)
            s = Element + "";

         while(Element >= 10){ //loop up to element is reduced to one digit number

            Digit = Element%10;

            s = s + "" +  Digit; //save the digits

            NewElement = Element/10;

            if(NewElement < 10) //when NewElement has 1 digit left
               s =  s + "" + NewElement;

            Element = NewElement; 
         }     

         System.out.print(s + " "); //print digit

         reverse(array, n-1); //recursive call 
      }


   }
}

1 Ответ

0 голосов
/ 23 апреля 2020

Это можно исправить, просто вставив continueInput = true во внешнюю строку, пока l oop. Без этого continueInput всегда будет ложным после того, как вы в первый раз введете корректный ввод, и ваша попытка l oop всегда завершится после одной итерации.

Однако я бы не стал бросать исключений самостоятельно, и вы, вероятно, должны обработать исключение InputMismatchException для сканера. Кроме того, ваш обратный метод неоправданно сложен. Вот код, который я получил:

import java.util.Scanner;

public class ReverseNumbers {

  public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    int[] numbers = new int[5]; //create array numbers size 5
    String another = "y";

    while (another.equalsIgnoreCase("Y")) { //loop to re-run program
      boolean continueInput = true; //controls loop for input
      outer: do {

          System.out.print("\nEnter " + numbers.length + " positive integers: ");

          try {
              for (int i = 0; i < numbers.length; i++) {
                  int num = input.nextInt();
                  if (num < 0) {
                      System.out.print("Invalid input, found a negative integer " + num)
                      continue outer;
                  } else {
                      numbers[i] = num;
                  }
              }
              continueInput = false;
          }
          //handle bad inputs that aren't digits
          catch (InputMismatchException ex) {
              System.out.print("\nInvalid input, please enter integers");
          }
      } while (continueInput); //outputs

      System.out.print("\nEntered numbers:\t\t");
      for (int e: numbers) System.out.print(e + " ");

      System.out.print("\nReversed numbers:\t\t");
      for (int i = numbers.length - 1; i >= 0; i--) {
          System.out.print(numbers[i] + (i == 0 ? "\n" : " "));
      }

      //output re-run program
      System.out.println();
      System.out.print("\nRe-run program with different values, Y/N? ");
      another = input.next();
    }
  }
}
...