Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java分数计算器-通过try/catch除法_Java_Try Catch_Netbeans 8_Illegalargumentexception_Dividebyzeroexception - Fatal编程技术网

Java分数计算器-通过try/catch除法

Java分数计算器-通过try/catch除法,java,try-catch,netbeans-8,illegalargumentexception,dividebyzeroexception,Java,Try Catch,Netbeans 8,Illegalargumentexception,Dividebyzeroexception,我正在开发一个程序,用户输入两个不同的分数,然后计算机通过分数法来测试它们是否相等。赋值中的另一个步骤是抛出IllegalArgumentException,以确定分母之一是否为0,然后重新启动程序。分数和testFraction类如下所示: 分数等级: class Fraction { private int numerator; private int denominator; Fraction() { numerator = 0;

我正在开发一个程序,用户输入两个不同的分数,然后计算机通过分数法来测试它们是否相等。赋值中的另一个步骤是抛出IllegalArgumentException,以确定分母之一是否为0,然后重新启动程序。分数和testFraction类如下所示:

分数等级:

class Fraction {

    private int numerator;
    private int denominator;

    Fraction() {
        numerator = 0;
        denominator = 1;

    }

    Fraction (int num, int den) {
        numerator = num;
        denominator = den;
        if (denominator == 0){
            throw new IllegalArgumentException (
            "Denominator cannot be zero");
        }
    }

    public void setNum(int num){
        numerator = num;
    }

    public void setDen(int den){
        denominator = den;

        }

    public int getNum(){
        return numerator;
    }

    public int getDen(){
        return denominator;
    }

    public String toString() {
        return numerator + "/" + denominator;
        }

    public boolean equals(Fraction other){
    if (numerator * other.getDen() == denominator * other.getNum()){
            return true;
         } 
        else {
            return false;
        }
    }
}
testFraction类:

import java.util.Scanner;

public class testFraction {

public static void main(String[] args) {

    Scanner keyboard = new Scanner(System.in); 
    int a = 1;
    int b = 1;
    int c = 1;
    int d = 1;

    Fraction f1 = new Fraction(a, b);
    Fraction f2 = new Fraction(c, d);


    System.out.println("Enter the numerator of the first fraction: ");
    f1.setNum(keyboard.nextInt());

    System.out.println("Enter the denominator of the first fraction: ");
    f1.setDen(keyboard.nextInt());

    try{
        int fraction = a/b; 
    }
    catch (IllegalArgumentException e){
        System.out.println(e.getMessage);
        main(args);
    }

    System.out.println("\nEnter the numerator of the second fraction: ");
    f2.setNum(keyboard.nextInt());

    System.out.println("Enter the denominator of the second fraction: ");
    f2.setDen(keyboard.nextInt());

    System.out.println("\nFraction 1: " + f1);
    System.out.println("Fraction 2: " + f2);

    System.out.println("\nAre fractions equal? " + f1.equals(f2));

    System.out.println(("\nWould you like to run the counter with a different integer? \n(1 for YES - 0 for NO): "));
    int answer = keyboard.nextInt();

    if (answer == 1){
        System.out.println("\nLet's Rock 'n Roll! ");
        main(args);
    }

    else if (answer == 0){
        System.out.println("\nLater Dude! ");
        System.exit(0);
    }       
}
}

我觉得我在试一试中做得不对。感谢您的帮助。

在初始化分数时,您抛出了一个IllegalArgumentException,但在testFraction中进行实际除法时,您试图捕获它。您的catch将永远不会到达,因为初始化时的异常将阻止代码到达错误的分区。您应该将try/catch放在创建分数的代码周围


此外,您使用模拟值初始化分数:1。这不是很有用,并且会带来一个问题:构造函数永远不会抛出它的IllegalArgumentException,因为它是用正确的值调用的。您应该在setDenominator中引发IllegalArgumentException,并从构造函数调用它。

初始化分数时抛出IllegalArgumentException,但在testFraction中进行实际除法时尝试捕捉它。您的catch将永远不会到达,因为初始化时的异常将阻止代码到达错误的分区。您应该将try/catch放在创建分数的代码周围


此外,您使用模拟值初始化分数:1。这不是很有用,并且会带来一个问题:构造函数永远不会抛出它的IllegalArgumentException,因为它是用正确的值调用的。您应该在setDenominator中引发IllegalArgumentException,并从构造函数中调用它。

除以
算术异常
作为补充说明,您应该避免通过再次调用main来重新启动程序。这将只是启动main的另一个实例,当它完成时,它将在旧的调用程序停止的地方进行。此外,它将增加堆栈大小。如果输入错误的次数足够多,就会出现堆栈溢出。改为使用循环。另外:构造函数抛出一个异常,但setter不会被除为0,而是算术异常。作为补充说明,您应该避免再次调用main来重新启动程序。这将只是启动main的另一个实例,当它完成时,它将在旧的调用程序停止的地方进行。此外,它将增加堆栈大小。如果输入错误的次数足够多,就会出现堆栈溢出。改为使用循环。另外:构造函数抛出异常,但setter没有??太棒了,这让程序抛出了异常谢谢!有没有办法在抛出异常后再次调用该方法?或者再次运行main?@NickPetrantoni当前您正在使用递归(main调用本身),当您可以将问题分解为更小的部分,其中每个步骤都基于上一步(或下一步)的结果时,这通常非常有用。正如其他人所提到的,它是有代价的,在这里你真的不需要递归。因此,重复任务的替代方法是使用迭代:您应该使用while循环,该循环将处理输入/输出、分数创建和使用,只要用户不要求停止。@NickPetrantoni如果这样做,则捕获部分之后应该没有任何内容,因此如果出现错误,循环将继续其下一次迭代。你应该使用正确的分数把代码放在try块中。我在尝试计算while循环时迷路了。你是说在testFraction类中,我应该说“当分母=0时,抛出异常并再次运行该方法?”@NickPetranoni否,你应该有如下内容:
boolean carryOn=true;while(carryOn){/*请求输入,然后尝试创建并使用分数;如果捕获到错误,则向用户发出信号*/*然后询问用户是否愿意继续;如果不愿意,则设置carryOn=false*/}
我很抱歉,注释对于编写代码来说不是很好,希望您理解!太棒了,这让程序抛出了异常谢谢!有没有办法在抛出异常后再次调用该方法?或者再次运行main?@NickPetrantoni当前您正在使用递归(main调用本身),当您可以将问题分解为更小的部分,其中每个步骤都基于上一步(或下一步)的结果时,这通常非常有用。正如其他人所提到的,它是有代价的,在这里你真的不需要递归。因此,重复任务的替代方法是使用迭代:您应该使用while循环,该循环将处理输入/输出、分数创建和使用,只要用户不要求停止。@NickPetrantoni如果这样做,则捕获部分之后应该没有任何内容,因此如果出现错误,循环将继续其下一次迭代。你应该使用正确的分数把代码放在try块中。我在尝试计算while循环时迷路了。你是说在testFraction类中,我应该说“当分母=0时,抛出异常并再次运行该方法?”@NickPetranoni否,你应该有如下内容:
boolean carryOn=true;while(carryOn){/*请求输入,然后尝试创建并使用分数;如果捕获到错误,则向用户发出信号*/*然后询问用户是否愿意继续;如果不愿意,则设置carryOn=false*/}
我很抱歉,注释对于编写代码来说不是很好,希望您理解!