【问题标题】:Using try-catch to handle input exceptions in Java [duplicate]使用 try-catch 处理 Java 中的输入异常 [重复]
【发布时间】:2020-04-02 04:29:15
【问题描述】:

我已经为此工作了几个小时,但我无法理解如何在这两个 do while 循环中实现 try-catch 以捕获用户输入非整数的情况。我知道有这方面的帖子,但我似乎无法得到它。我非常感谢任何建议。

public class Paint {
    public static void main(String[] args) {
        Scanner scnr = new Scanner(System.in);

        double wallHeight;
        double wallWidth;
        double wallArea = 0.0;
        double gallonsPaintNeeded = 0.0;
        final double squareFeetPerGallons = 350.0;

        // Implement a do-while loop to ensure input is valid
        // Handle exceptions(could use try-catch block)
        do {
            System.out.println("Enter wall height (feet): ");
            wallHeight = scnr.nextDouble();
        } while (!(wallHeight > 0));
        // Implement a do-while loop to ensure input is valid
        // Handle exceptions(could use try-catch block)
        do {
            System.out.println("Enter wall width (feet): ");
            wallWidth = scnr.nextDouble();
        } while (!(wallWidth > 0));

        // Calculate and output wall area
        wallArea = wallHeight * wallWidth;
        System.out.println("Wall area: " + wallArea + " square feet");

        // Calculate and output the amount of paint (in gallons) 
        // needed to paint the wall
        gallonsPaintNeeded = wallArea/squareFeetPerGallons;
        System.out.println("Paint needed: " + gallonsPaintNeeded + " gallons");

    }
}

【问题讨论】:

    标签: java try-catch inputmismatchexception


    【解决方案1】:

    首先在类中将 wallHeight 和 wallWidth 初始化为一个临时值(我们将使用 0):

    double wallHeight = 0;
    double wallWidth = 0;
    

    然后你想把scnr.nextDouble(); 放在try 块中以捕获解析错误:

    do {
            System.out.println("Enter wall height (feet): ");
            try{
                wallHeight = scnr.nextDouble();
            }catch(InputMismatchException e){
                scnr.next(); //You need to consume the invalid token to avoid an infinite loop
                System.out.println("Input must be a double!");
            }
        } while (!(wallHeight > 0));
    

    注意catch 块中的scnr.next();。您需要执行此操作才能使用无效令牌。否则它将永远不会从缓冲区中删除,scnr.nextDouble(); 将继续尝试读取它并立即抛出异常。

    【讨论】:

    • 这正是发生的事情,我一直在离开scnr.nextDouble();。我不敢相信这段代码让我如此受挫,我一定会记住这一点。感谢您的帮助!
    • @Chris 没问题,伙计。祝你项目的其余部分好运!
    猜你喜欢
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多