如何在捕获异常后保持代码运行(Java)

如何在捕获异常后保持代码运行(Java),java,exception,Java,Exception,我正在尝试为一个类项目编写代码,该类项目可以处理来自用户的所有异常和无效条目 import java.util.Scanner; public class Paint1 { public static void main(String[] args) { Scanner scnr = new Scanner(System.in); double wallHeight = 0.0; double wallWidth = 0.0; double wallArea

我正在尝试为一个类项目编写代码,该类项目可以处理来自用户的所有异常和无效条目

import java.util.Scanner;

public class Paint1 {

public static void main(String[] args) {
    Scanner scnr = new Scanner(System.in);
    double wallHeight = 0.0;
    double wallWidth = 0.0;
    double wallArea = 0.0;
    double gallonsPaintNeeded = 0.0;

    final double squareFeetPerGallons = 350.0;

    // Implement a do-while loop to ensure input is valid
    // Prompt user to input wall's height
    try {
        //System.out.println("Enter wall height (feet): ");
        do {//wallHeight = scnr.nextDouble();
            System.out.println("Enter wall height (feet): ");
            wallHeight = scnr.nextDouble();
            if (wallHeight <= 0) {
                System.out.println("Invalid height");
            }
        } while (wallHeight <= 0);
    } catch (Exception excpt) {
        System.out.println("Invalid height");
        wallHeight = scnr.nextDouble();
    }

    // Implement a do-while loop to ensure input is valid
    // Prompt user to input wall's width
    do {
        System.out.println("Enter wall width (feet): ");
        wallWidth = scnr.nextDouble();
        if (wallWidth <= 0) {
            System.out.println("Invalid Width");
        }
    } 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");

}
}
import java.util.Scanner;
公共级油漆工1{
公共静态void main(字符串[]args){
扫描仪scnr=新扫描仪(System.in);
双壁高度=0.0;
双壁宽=0.0;
双瓦莱拉=0.0;
需要两加仑的油漆=0.0;
最终双平方英尺Pergallons=350.0;
//实现do-while循环以确保输入有效
//提示用户输入墙的高度
试一试{
//System.out.println(“输入墙高(英尺):”;
do{//wallHeight=snr.nextDouble();
System.out.println(“输入墙高(英尺):”;
墙高=scnr.nextDouble();
if(墙高)

这甚至可以防止抛出InputMismatchException,因为您总是在读取它之前确保它匹配。

您当前的输入提示方法(在
墙宽
墙高
上)是有缺陷的,因为您捕获了一个异常,几乎肯定是
InputMismatchException
(然后您无法使用不是数字的令牌)。我强烈建议您将提示提取到另一个方法;类似

private static double readWallDimension(Scanner scnr, String dimension) {
    for (;;) {
        try {
            System.out.printf("Enter wall %s (feet):%n", dimension);
            double dim = scnr.nextDouble();
            if (dim <= 0) {
                System.out.printf("Invalid %s%n", dimension);
            } else {
                return dim;
            }
        } catch (InputMismatchException excpt) {
            System.out.printf("Invalid %s%n", dimension);
            scnr.nextLine();
        }
    }
}

以下是一个基于您的代码的工作变体,包括修复和解释:

    // Implement a do-while loop to ensure input is valid
    // Prompt user to input wall's height
    do { // moved one level up <- enable repeated input until it is valid
        try { // moved one level down <- catch exception where it occurs
            System.out.println("Enter wall height (feet): ");
            wallHeight = scnr.nextDouble();
            if (wallHeight <= 0) {
                System.out.println("Invalid height");
            }
        } catch (Exception excpt) { // generally better: InputMismatchException
            System.out.println("Invalid height");
            scnr.nextLine(); // SKIP THIS INVALID LINE.
            // Otherwise calling nextDouble() only throws the same exception as previously.
        }
    } while (wallHeight <= 0);
//实现do-while循环以确保输入有效
//提示用户输入墙的高度
do{//向上移动一级
import java.util.Scanner;
公共级油漆工1{
公共静态void main(字符串[]args){
扫描仪scnr=新扫描仪(System.in);
双壁高度=0.0;
双壁宽=0.0;
双瓦莱拉=0.0;
需要两加仑的油漆=0.0;
布尔值validNumber=false;
最终双平方英尺Pergallons=350.0;
//实现do-while循环以确保输入有效
//提示用户输入墙的高度
做{
System.out.println(“输入墙高(英尺):”;
if(序号hasNextDouble()){
墙高=scnr.nextDouble();
validNumber=true;
如果(墙高>0){
墙高=墙高;
}否则{
System.out.println(“必须大于0。请重试”);
validNumber=false;
}
}否则{
System.out.println(“输入无效。请重试”);
System.out.println();
validNumber=false;
scnr.next();
} 
}而(!validNumber);
//实现do-while循环以确保输入有效
//执行if-else循环以确保给出正确的值/类型
//提示用户输入墙的宽度
validNumber=false;
做{
System.out.println(“输入墙宽(英尺):”;
if(scnr.hasNextDouble()){
墙宽=scnr.nextDouble();
validNumber=true;
如果(墙宽>0){
墙宽=墙宽;
}否则{
System.out.println(“必须大于0。请重试”);
validNumber=false;
}
}否则{
System.out.println(“输入无效。请重试”);
System.out.println();
validNumber=false;
scnr.next();
}    
}而(!validNumber);
//计算并输出墙面积
wallArea=墙高*墙宽;
系统输出打印(“墙面积:+wallArea+“平方英尺”);
//计算并输出绘制墙所需的油漆量(加仑)
所需的加仑量=瓦拉/平方英尺/加仑;
System.out.println(“需要油漆:+需要油漆+加仑”);
}
}

我认为您只需要将try/catch放在do-while循环中。将try/catch放在引发异常的方法周围,而不是放在整个do-while-no?中。对于一个方法来说,代码太多了。尝试分成简单的方法,然后在真正需要的方法中进行异常抑制。我对此表示感谢我相信它会起作用,但我也担心它会显得奇怪和可疑,因为这段代码中有很多都使用了我们课程中尚未涉及的内容。这项作业特别是为了测试我们处理异常的能力。我尝试做的事情可能吗?@DavidConrod你应该仔细看看我发布的方法ed;它来自您的问题,当然可以应用于您当前的代码。将
return dim;
更改为
break;
以终止循环。将
printf
调用替换为您现有的提示,
for(;;)
while(true)相同
。还有什么您还没有介绍的吗?谢谢,这非常有帮助。您能解释一下为什么它不能像我现在这样工作吗?哦,我明白了,所以我需要添加一些内容来处理导致异常的输入。对不起,我只使用Java几个月,所以我还不太精通它。怎么了无论如何,如果没有找到有效的double,它将阻止输入前进,因为那里的令牌没有被使用。@daniu,是的,请参阅我的答案以了解如何解决此问题。如果您愿意,您也可以向上投票…@daniu我认为防止未经检查的异常而不是处理它们的最佳方法。我的答案只是传达了这个想法。请参考下面的链接。下面的链接讨论了为什么我们不应该捕获未检查的异常。在do/while循环中使用if/else循环以确保变量类型/值符合要求。Try/catch是另一种方法,但我使用了if/else循环。
public static void main(String[] args) {
    Scanner scnr = new Scanner(System.in);
    final double squareFeetPerGallons = 350.0;

    double wallHeight = readWallDimension(scnr, "height");
    double wallWidth = readWallDimension(scnr, "width");

    // Calculate and output wall area
    double 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
    double gallonsPaintNeeded = wallArea / squareFeetPerGallons;
    System.out.println("Paint needed: " + gallonsPaintNeeded + " gallons");
}
    // Implement a do-while loop to ensure input is valid
    // Prompt user to input wall's height
    do { // moved one level up <- enable repeated input until it is valid
        try { // moved one level down <- catch exception where it occurs
            System.out.println("Enter wall height (feet): ");
            wallHeight = scnr.nextDouble();
            if (wallHeight <= 0) {
                System.out.println("Invalid height");
            }
        } catch (Exception excpt) { // generally better: InputMismatchException
            System.out.println("Invalid height");
            scnr.nextLine(); // SKIP THIS INVALID LINE.
            // Otherwise calling nextDouble() only throws the same exception as previously.
        }
    } while (wallHeight <= 0);