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