当前位置: 首页 > 知识库问答 >
问题:

在do while循环中尝试/捕获以检查用户输入(数组)-错误的布尔初始化和位置

胡永逸
2023-03-14

我是一个Java的初学者,我正在学习管理异常和2D数组。我正在做一个练习,在2D数组中绘制不同车型销售的结果。

我已经通过使用 try catch 或抛出自定义异常来混合处理异常的方法。在自定义异常中,我有一个无法解决的问题。

在卖家类别中:

  • 在第16行,IDE告诉我变量“正确”初始化为false是冗余的冗余初始化
  • 在第26行中,IDE告诉我当条件总是假的。do而循环的错误最终条件

我想在内部循环中声明布尔值正确,以检查每个值的输入是否正确(整数),然后在尝试结束时将值更改为true,以防parseInt成功。通过阅读IDE中的注释,我明白即使选择整数,布尔值正确值也不会更改为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();
    }
}

共有3个答案

夹谷硕
2023-03-14

当您抛出异常时,它会退出函数并抛出异常。因此,只需打印和错误消息,而不是在抓块中抛出异常。以便用户可以理解错误并再次输入输入。

 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) ;
田永春
2023-03-14

你的代码非常好,结构很好。实际上,您应该比较CheckInput.control的来源,以了解为什么它没有上述警告:您将局部变量初始化为正确的,并且在输入无效的情况下不会引发异常,从而让用户更正它。如果像在 main 方法中一样从 do-while 循环内部抛出异常,则永远不会使用 correctfalse 值。

您应该通过在初始化 2D 销售数组时重用现有的 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] + " = ");
    }
}
裘臻
2023-03-14

有两种方式可以退出此do-而循环:正确为真或抛出异常。

从技术上讲,异常只能在语句correct=true上方的两行中抛出。由于您在循环中抛出了NumberArrayException,因此它将退出,或者correct将设置为true。

当我们到达< code>while(!correct),那么< code>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);
 类似资料:
  • *编辑:好的,在修复了try catch错误后,我在< code>catch {..打印时。*,基本上,当我说我想再玩一次时,它会继续游戏,但它也会打印第一个< code>catch,然后在第23行要求输入。 嗨,这是我的第一篇文章,所以如果我在论坛上的代码格式错误,我会编辑它。 现在我正在用java eclipse编写一个游戏,其中cpu生成一个数字,用户必须猜测它。我大部分时间都在使用扫描仪类

  • 问题内容: 我有这个代码 有人可以告诉我我在这里到底在做什么错,我该如何纠正?我只需要将所有数组元素初始化为布尔型false。谢谢 问题答案: 我只需要将所有数组元素初始化为布尔型false。 请改用任一方法,以便所有值默认为: 或者 使用填充整个数组: 另请注意,数组索引基于零。该行如你有会导致。要了解有关Java中数组的更多信息,请查阅此基本Oracle教程。

  • 问题内容: 这里的Python新手非常抱歉,我确定这是一个愚蠢的问题,但是我似乎无法在要求我使用while循环检查有效用户输入的教程中解决以下挑战。 (使用Python2.7) 这是我的代码,但无法正常工作: 上面打印输出到控制台: 这显然是不正确的-循环应该在用户输入“ y”或“ n”时结束,但是我不确定如何执行此操作。我在这里做错了什么? 注意:挑战要求我同时使用运算符和 问题答案: 较短的解

  • 因此,我对python(在Spyder IDE3.8中使用Python3)相对来说是个新手。我有下面的主要计算文件,其中几个函数汇集在一起,并循环通过。现在,我试图用等级函数来评估spray_pressure、spray_angle和particle_size的单个值是否在给定的边框中。如果不是,则0转到新数组,如果是,则实际值存储在新数组中。所以我想将所有的输出存储在4个新的数组spray_pr

  • 问题内容: 下面的代码询问用户他/她想要多少个赛车手。 如果在代码中输入数字,则代码会跳出循环,并且程序的其余部分可以正常运行;但是,当我输入诸如“ awredsf”之类的内容时,它应该捕获该异常,并且确实如此。它没有连续提示用户,而是连续循环,这对我来说没有意义。 连续循环时,程序打印如下: 多少赛车手应该参加比赛?多少赛车手应该参加比赛?多少赛车手应该参加比赛?多少赛车手应该参加比赛?多少赛车

  • 我正在尝试创建一个检查整数的函数,并将继续循环,直到用户正确输入17或更高的整数。但是,如果我输入错误的输入,例如“K”或“