在 do-while 循环中尝试/捕获以检查用户输入(数组) - 错误的布尔初始化和位置
Try / catch in a do-while loop to check user input (array) - wrong boolean initialization and position
我是 Java 初学者,我正在学习管理异常和二维数组。
我正在做一个练习,在二维数组中绘制不同车型的销售结果。
我已经混合使用 try catch 或抛出自定义异常来处理异常。关于自定义异常,我遇到了无法解决的问题。
在卖家class:
- 在第 16 行,IDE 告诉我变量“正确的”初始值设定项为
false 是多余的
- 在第 26 行,IDE 告诉我 while 条件始终为假。
我想在内部循环中声明布尔值正确,以检查每个值是否输入正确(整数),然后在尝试结束时将值更改为 true 以防 parseInt那是成功的。通过阅读 IDE 的评论,我了解到即使我 select 一个整数,布尔值正确也永远不会更改为 true,但我不明白为什么。
import java.util.Scanner;
public class Sellers {
public static void main(String[] args) throws NumberArrayException {
Scanner myObj = new Scanner(System.in);
int nbrOfSellers = CheckInput.control("Enter the number of sellers = ");
int nbrOfModels = CheckInput.control("Enter the number of models = ");
int[][] sales = new int[nbrOfSellers][nbrOfModels];
String[] nameOfSellers = Characters.construction("seller", nbrOfSellers);
String[] nameOfModels = Characters.construction("model", nbrOfSellers);
for(int i = 0; i < nbrOfSellers; i++) {
for(int j = 0; j < nbrOfModels; j++) {
boolean correct = false;
System.out.print("Enter the sales for the seller " + nameOfSellers[i] + " for the model " + nameOfModels[i] + " = ");
do {
try {
String input = myObj.nextLine();
sales[i][j] = Integer.parseInt(input);
correct = true;
} catch (NumberFormatException e) {
throw new NumberArrayException();
}
}while (!correct) ;
}
}
for(int i = 0; i < nbrOfSellers; i++) {
for(int j = 0; j < nbrOfModels; j++) {
System.out.print(sales[i][j] + " ");
}
System.out.println();
}
}
}
import java.util.Scanner;
public class Characters {
public static String[] construction(String character, int maxSize) {
Scanner myObj = new Scanner(System.in);
String[] myArray = new String[maxSize];
for(int i = 0; i < maxSize; i++) {
System.out.print("Enter the name of the " + character + " ");
myArray[i] = myObj.nextLine();
}
return myArray;
}
}
import java.util.Scanner;
public class CheckInput {
public static int control(String message) {
boolean correct = false;
int number = -1;
Scanner myObj = new Scanner(System.in);
do {
try {
System.out.print(message);
String input = myObj.nextLine();
number = Integer.parseInt(input);
correct = true;
} catch(NumberFormatException e) {
System.out.println("Enter a number");
}
}while(!correct);
return number;
}
}
public class NumberArrayException extends RuntimeException {
public NumberArrayException() {
super();
}
}
您的代码非常好并且结构合理。实际上,您应该比较 CheckInput.control
的来源,看看为什么它没有提到的警告:您初始化局部变量 correct
,因为它应该是 和 没有在无效输入的情况下抛出异常,从而让用户更正它。如果您像在 main
方法中一样从 do-while
循环内部抛出异常,则永远不会使用 correct
的 false
值。
您应该在初始化 2D sales
数组时重新使用现有的 CheckInput.control
来解决这些警告。在创建 nameOfModels
时也有错字——nbrOfModels
应该作为参数传递。
String[] nameOfSellers = Characters.construction("seller", nbrOfSellers);
String[] nameOfModels = Characters.construction("model", nbrOfModels);
for(int i = 0; i < nbrOfSellers; i++) {
for(int j = 0; j < nbrOfModels; j++) {
sales[i][j] = CheckInput.control("Enter the sales for the seller " + nameOfSellers[i] + " for the model " + nameOfModels[i] + " = ");
}
}
当您抛出异常时,它会退出函数并抛出异常。因此,不是在 catch 块中抛出异常,而是打印和错误消息。以便用户可以理解错误并再次输入。
do {
try {
String input = myObj.nextLine();
sales[i][j] = Integer.parseInt(input);
correct = true;
} catch (NumberFormatException e) {
System.out.println("Wrong input format. Please enter a number");
}
}while (!correct) ;
这个 do-while-loop 可以通过两种方式退出:correct
是 true 或者异常是抛出。
从技术上讲,只能在语句 correct = true
上面的两行中抛出异常。由于您将 NumberArrayException
放入循环中,它会因此退出,或者 correct
将被设置为 true.
当我们达到 while (!correct)
时,correct
始终为真,因为它已设置。否则我们会异常退出。因此,这个循环永远不会有第二次迭代。
要修复它,您可以避免在无法解析提供的输入时抛出异常。然后循环会让用户输入另一个整数。
do {
try {
String input = myObj.nextLine();
sales[i][j] = Integer.parseInt(input);
correct = true;
} catch (NumberFormatException e) {
// output error message for the user here
}
} while (!correct);
我是 Java 初学者,我正在学习管理异常和二维数组。 我正在做一个练习,在二维数组中绘制不同车型的销售结果。
我已经混合使用 try catch 或抛出自定义异常来处理异常。关于自定义异常,我遇到了无法解决的问题。
在卖家class:
- 在第 16 行,IDE 告诉我变量“正确的”初始值设定项为
false 是多余的
- 在第 26 行,IDE 告诉我 while 条件始终为假。
我想在内部循环中声明布尔值正确,以检查每个值是否输入正确(整数),然后在尝试结束时将值更改为 true 以防 parseInt那是成功的。通过阅读 IDE 的评论,我了解到即使我 select 一个整数,布尔值正确也永远不会更改为 true,但我不明白为什么。
import java.util.Scanner;
public class Sellers {
public static void main(String[] args) throws NumberArrayException {
Scanner myObj = new Scanner(System.in);
int nbrOfSellers = CheckInput.control("Enter the number of sellers = ");
int nbrOfModels = CheckInput.control("Enter the number of models = ");
int[][] sales = new int[nbrOfSellers][nbrOfModels];
String[] nameOfSellers = Characters.construction("seller", nbrOfSellers);
String[] nameOfModels = Characters.construction("model", nbrOfSellers);
for(int i = 0; i < nbrOfSellers; i++) {
for(int j = 0; j < nbrOfModels; j++) {
boolean correct = false;
System.out.print("Enter the sales for the seller " + nameOfSellers[i] + " for the model " + nameOfModels[i] + " = ");
do {
try {
String input = myObj.nextLine();
sales[i][j] = Integer.parseInt(input);
correct = true;
} catch (NumberFormatException e) {
throw new NumberArrayException();
}
}while (!correct) ;
}
}
for(int i = 0; i < nbrOfSellers; i++) {
for(int j = 0; j < nbrOfModels; j++) {
System.out.print(sales[i][j] + " ");
}
System.out.println();
}
}
}
import java.util.Scanner;
public class Characters {
public static String[] construction(String character, int maxSize) {
Scanner myObj = new Scanner(System.in);
String[] myArray = new String[maxSize];
for(int i = 0; i < maxSize; i++) {
System.out.print("Enter the name of the " + character + " ");
myArray[i] = myObj.nextLine();
}
return myArray;
}
}
import java.util.Scanner;
public class CheckInput {
public static int control(String message) {
boolean correct = false;
int number = -1;
Scanner myObj = new Scanner(System.in);
do {
try {
System.out.print(message);
String input = myObj.nextLine();
number = Integer.parseInt(input);
correct = true;
} catch(NumberFormatException e) {
System.out.println("Enter a number");
}
}while(!correct);
return number;
}
}
public class NumberArrayException extends RuntimeException {
public NumberArrayException() {
super();
}
}
您的代码非常好并且结构合理。实际上,您应该比较 CheckInput.control
的来源,看看为什么它没有提到的警告:您初始化局部变量 correct
,因为它应该是 和 没有在无效输入的情况下抛出异常,从而让用户更正它。如果您像在 main
方法中一样从 do-while
循环内部抛出异常,则永远不会使用 correct
的 false
值。
您应该在初始化 2D sales
数组时重新使用现有的 CheckInput.control
来解决这些警告。在创建 nameOfModels
时也有错字——nbrOfModels
应该作为参数传递。
String[] nameOfSellers = Characters.construction("seller", nbrOfSellers);
String[] nameOfModels = Characters.construction("model", nbrOfModels);
for(int i = 0; i < nbrOfSellers; i++) {
for(int j = 0; j < nbrOfModels; j++) {
sales[i][j] = CheckInput.control("Enter the sales for the seller " + nameOfSellers[i] + " for the model " + nameOfModels[i] + " = ");
}
}
当您抛出异常时,它会退出函数并抛出异常。因此,不是在 catch 块中抛出异常,而是打印和错误消息。以便用户可以理解错误并再次输入。
do {
try {
String input = myObj.nextLine();
sales[i][j] = Integer.parseInt(input);
correct = true;
} catch (NumberFormatException e) {
System.out.println("Wrong input format. Please enter a number");
}
}while (!correct) ;
这个 do-while-loop 可以通过两种方式退出:correct
是 true 或者异常是抛出。
从技术上讲,只能在语句 correct = true
上面的两行中抛出异常。由于您将 NumberArrayException
放入循环中,它会因此退出,或者 correct
将被设置为 true.
当我们达到 while (!correct)
时,correct
始终为真,因为它已设置。否则我们会异常退出。因此,这个循环永远不会有第二次迭代。
要修复它,您可以避免在无法解析提供的输入时抛出异常。然后循环会让用户输入另一个整数。
do {
try {
String input = myObj.nextLine();
sales[i][j] = Integer.parseInt(input);
correct = true;
} catch (NumberFormatException e) {
// output error message for the user here
}
} while (!correct);