Java Fraction Calculator - DivideByZeroMethod через попытку / поймать

Я работаю над программой, в которой пользователь вводит две разные дроби, а затем компьютер запускает их через метод дроби, чтобы проверить, равны они или нет. Дополнительным шагом в назначении является создание исключения IllegalArgumentException, чтобы определить, равен ли один из знаменателей 0, и, в свою очередь, перезапустить программу. Классы Fraction и 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);
    }       
}
}

Я чувствую, что я неправильно работаю в try/catch. Спасибо за вашу помощь.

1 ответ

Решение

Вы генерируете исключение IllegalArgumentException при инициализации фракции, но пытаетесь ее перехватить, когда выполняете фактическое деление в testFraction. Ваша добыча никогда не будет достигнута, так как исключение при инициализации не позволит коду достичь неправильного деления. Вместо этого вы должны поместить свой try / catch в код, создающий фракции.

Более того, вы инициализируете свои фракции с помощью ложных значений: 1. Это не очень полезно и создает проблему: ваш конструктор никогда не сгенерирует исключение IllegalArgumentException, поскольку он вызывается с правильными значениями. Вместо этого вы должны вызвать IllegalArgumentException в вашем setDenominator и вызвать его из вашего конструктора.

Другие вопросы по тегам