java异常处理 - 除以零并按文本方法除

时间:2016-04-30 22:20:46

标签: java exception-handling

我已经做了4个月的java,所以我还是个业余爱好者。只是想完成一些hwk。似乎无法通过拒绝文本数据和零来找到正确的提示,让我的分母运行良好,同时保持与错误消息的循环。另一个问题是,无论我的分子/分母是什么,我的商都是0.0。很多问题,任何建议表示赞赏。方向如下:

- 该程序获取(int)分子和的用户输入 (int)分母然后计算并显示(双)商。

- 如果用户为分子输入文本而不是数字,则显示解释问题的错误消息并使用户循环,直到输入正确的数据。

- 如果用户为分母输入文本或零而不是数字,则显示解释问题的错误消息并使用户保持循环,直到输入正确的数据。

- 有关问题的信息应该是描述性的。

public static void main(String[] args) throws Exception {
    Scanner console = new Scanner(System.in);
    int n1 = 0; //number 1
    int n2 = 1; //number 2..
    double r = (double) n1 / n2; //quotient
    String n1Str = "Please enter a real number for the numerator";
    String n2Str = "Please enter a real number greater than zero for the denominator";
    String errMsg = "Please enter a real number.";
    String notZero = "Denominator cannot equal zero.";      // not all string msgs are used, just there in case i need them.

    try {
        n1 = getInteger(n1Str); // validates against alphabet
        if (hasNextInt()) {     // working
            n1 = console.nextInt();
        }
    } catch (InputMismatchException ime) {
    }

    try {
        n2 = getInteger2(n2Str); // trying to validate against alphabet & zero
        if (hasNextInt()) {     //  not working though... 
            n2 = console.nextInt();
        }
    } catch (InputMismatchException ime) {
    }
    System.out.println("Fraction result is " + r);
}   

public static int getInteger(String message) {
    Scanner console = new Scanner(System.in);
    int count = 0;
    boolean isValidInteger = false;
    do {
        System.out.println(message);
        if (console.hasNextInt()) {
            isValidInteger = true;
            count = console.nextInt();
        } else {
            console.nextLine();
        }
    } while (!isValidInteger);
    return count;
}

public static int getInteger2(String message) {
    Scanner console = new Scanner(System.in);
    int count = 0;
    boolean isValidInteger = false;

    do {
        System.out.println(message);
        if (console.nextInt() != 0 || console.hasNextInt()) { // validates against zero but 
            isValidInteger = true;              // can't get it to validate against text.
            count = console.nextInt();  //tried switching statements and using && but get thrown into endless loop
        }
    } while (!isValidInteger);
    return count;
}

private static boolean hasNextInt() {
    return false;
}
}

3 个答案:

答案 0 :(得分:0)

你的商“r”始终为0.0的事实是因为你将n1初始化为0并且n2 = 1;您应该只声​​明变量并在代码中初始化它们;即当你想从用户那里获得价值时。

答案 1 :(得分:0)

您的代码存在很多问题。

对于初学者,您应该只有一个Scanner,它将在您的应用程序的整个生命周期中存在。无需实例化多个扫描仪。

public class SomeClass {

    private static Scanner console;

    public static void main(String[] args) throws Exception {

        console = new Scanner(System.in);

        (...)

        console.close();
    }
}

现在让我们来看看有问题的getInteger2方法。

如果输入是整数,您应该像在getInteger方法上那样简单验证。如果是,则进行处理;否则,您可以使用next()(而不是nextLine())跳过它,因为您想跳过此扫描仪的下一个完整令牌。

public static int getInteger2(String message) {
    int count = -1;

    boolean isValidInteger = false;

    do {
        System.out.println(message);

        if (console.hasNextInt()) {
            count = console.nextInt();

            if (count != 0) {
                isValidInteger = true;
            } else {
                System.out.println("Denominator cannot equal zero.");
            }
        } else {
            console.next();
        }
    } while (!isValidInteger);

    return count;
}

最后,您的商始终被打印0.0,因为您在输出之前未更新其值:

r = (double) n1 / n2;
System.out.println("Fraction result is " + r);

答案 2 :(得分:0)

您的代码/逻辑似乎有两个“主要”问题......

问题1)获得输入后,您没有计算r(你的商)。

所以线条: } catch (InputMismatchException ime) { } System.out.println("Fraction result is " + r); 可以改为: } catch (InputMismatchException ime) { } r = (double) n1 / n2; //calculate the quotient System.out.println("Fraction result is " + r);

问题2) 你的代码: do { System.out.println(message); if (console.nextInt() != 0 || console.hasNextInt()) { // validates against zero but isValidInteger = true; // can't get it to validate against text. count = console.nextInt(); //tried switching statements and using && but get thrown into endless loop } } while (!isValidInteger); return count; 如果您不想在代码中进行太多更改,可以将其更改为此类内容: do { System.out.println(message); try { if ((count = console.nextInt()) != 0) { isValidInteger = true; } } catch (InputMismatchException ime) { return getInteger2(message); } } while (!isValidInteger); return count; 因此,只有当console中的输入为int时,才会使用nextInt()将其读取并将其存储在count中。在您的代码中,您将使用int阅读nextInt(),如果是int,则会使用nextInt()再次阅读,这会导致用户写入int在检查int是否int导致InputMismatchException被抛出之前,您已阅读int的问题。在我发送给您的代码中,如果读取的数字是0而不是0则会返回,如果int您的循环再次运行且它不是{{1}} {1}}只需再次调用该方法(参见Recursion)。 我希望这有助于您了解问题。 然而,最好的方法是重新设计你的代码。