Как использовать try catch для замены недопустимых данных пользовательского массива ввода вместо перезапуска кода на Java?

#java #arrays #try-catch #java.util.scanner #user-input

#java #массивы #try-catch #java.util.scanner #пользовательский ввод

Вопрос:

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

 import java.util.Scanner;

public class Array {
  public static void main(String args[]) {
    int z = 1;
    do {
      try {  
        Scanner scanner = new Scanner(System.in);
       
        double[] myArr1 = new double[10];  //Creates array
        System.out.println("");
        System.out.println("Enter 10 elements: ");
        System.out.println("");
    
        for (int x=0; x<myArr1.length; x  ) {
          myArr1[x] = scanner.nextDouble();  //Gets user input
        }  //end of for
    
    
        double sum1 = 0;
        for(double x=0; x<myArr1.length; x  ) {
            sum1  = myArr1[(int) x];  //Defines sum1
        }  //end of for
    
        double[] myArr2 = new double[10];  //Creates array
        System.out.println("Enter 10 elements: ");
        System.out.println("");
    
        for (int y=0; y<myArr2.length; y  ) {
          myArr2[y] = scanner.nextDouble();  //Gets user input
        }  //end of for
        double sum2 = 0;
        for (double y=0; y<myArr2.length; y  ) {
          sum2  = myArr2[(int) y];
        }  //end of for
        System.out.println("Sum of first 10 elements is: "   sum1);  //Prints sum of first 10 elements
        System.out.println("Sum of second 10 elements is: "   sum2);  //Prints sum of last 10 elements
    
      }/*end of try*/catch (Exception e) {  //Catches errors in user input
         System.out.println("Invalid input. Try again: ");
         System.out.println("");
         }  //end of catch
    }//end of do
    while(z==1);
    return;
  }
}
  

Комментарии:

1. Сделайте try-catch вокруг scanner.nextDouble() операторов, а не вокруг всего метода?

Ответ №1:

Вы можете создать вспомогательный метод для ввода. Он будет постоянно запрашивать предоставленные сообщения, пока не будет введен правильный тип. Это обычно бывает удобно, когда входные данные необходимо брать из разных мест в программе.

 public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    double v = nextDouble(input, "Please enter a value: ", "Improper type, try again: ");
    System.out.println(v);
}
public static double nextDouble(Scanner input, String prompt, String error) {
    System.out.print(prompt);
    // loop forever
    for(;;) {    
       try {
          double v = input.nextDouble();
          return v;
       } catch (InputMismatchException ie) {
            input.nextLine(); // clear input buffer
            System.out.print(error);
           
       }
    }
}
  

Вот пример из вашего кода.

 Scanner scanner = new Scanner(System.in);
String prompt = "Please enter a number: ";
String error = "Invalid input, try again";

double[] myArr1 = new double[10]; // Creates array
System.out.println("");
System.out.println("Enter 10 elements: ");
System.out.println("");

for (int x = 0; x < myArr1.length; x  ) {
    myArr1[x] = nextDouble(scanner, prompt, error);
} // end of for

double sum1 = 0;
for (double x = 0; x < myArr1.length; x  ) {
    sum1  = myArr1[(int) x]; // Defines sum1
} // end of for
  

Избавьтесь от существующих блоков try / catch. И я не знаю, почему у вас есть do/while , поскольку вы не выполняете цикл более одного раза.

Комментарии:

1. Вы можете поместить код (т. Е. Метод) в любом месте вашего класса, но не внутри main или любого другого rmethod. Вы можете вызвать метод, из которого вы обычно вызываете сканер для ввода.

Ответ №2:

или вы можете использовать цикл while и логическое значение для получения числа

 Scanner scanner = new Scanner(System.in);
boolean bool = true;
double d ;//= scanner.nextDouble();
while(bool){
    try{ 
        scanner = new Scanner(System.in);
        d = scanner.nextDouble();
        bool = false; 
    }catch(InputMismatchException e){
        System.err.println("invalid input");
    }
}
  

Ответ №3:

Я понял это. Мне пришлось создать логическое значение, но также уменьшить индекс массива, в котором размещался неверный ввод (i = i-1). Я также создал только один массив и установил для первых 10 значений значение x, а для последних 10 — значение y, чтобы сделать его немного проще.

 import java.util.Scanner;

public class Array {
    public static void main(String[] args) {
        double[] array = new double[20];  //creates array
        boolean on = true;  //sets value "on"

        while (on) {  //starts while loop
        

            System.out.println("Enter 20 numbers: ");
            System.out.println("");

            for (int i = 0; i < array.length; i  ) {  //creates user input prompt
            
                Scanner input = new Scanner(System.in);  //gets user input

                try {
                    array[i] = input.nextDouble();  //assigns user input to array[i]
                }/*end of try*/ catch (Exception e) {  //catches invalid input
                
                    System.err.println("Invalid Input. Try again: ");
    
                    i = i - 1;  //decrements index of re-entered number
                }  //end of catch
            }  //end of for

            double x = 0;
            for (int z = 0; z < 10; z  ) {
                x  = array[z];
            }  //end of for
            System.out.println("Sum of first 10 numbers = "   x);  //adds first 10 numbers in array and assigns them to x

            System.out.println("");

            double y = 0;
            for (int z = 10; z < 20; z  ) {
                y  = array[z];
            }  //end of for
            System.out.println("Sum of last 10 numbers = "   y);  //adds last 10 numbers in array and assigns them to y

            on = false;  //breaks while loop
        }  //end of while
    }
}