class RationalNumber { // Data fields for numerator and denominator private int numerator; private int denominator; /** Default constructor */ public RationalNumber() { this.numerator = 0; this.denominator = 1; } /** Construct a rational with specified numerator and denominator */ public RationalNumber(int numerator, int denominator) throws IrrationalNumberException{ if (denominator == 0) { throw new IrrationalNumberException("Denominator cannot be 0. ",numerator, denominator); } this.numerator = numerator; this.denominator = denominator; } /** Return numerator */ public int getNumerator() { return numerator; } /** Return denominator */ public int getDenominator() { return denominator; } /** Add a rational number to this rational */ public RationalNumber add(RationalNumber secondRational) { RationalNumber rn = null; int n = numerator*secondRational.getDenominator() + denominator*secondRational.getNumerator(); int d = denominator*secondRational.getDenominator(); try{ rn = new RationalNumber(n,d); } catch(IrrationalNumberException ine){ System.out.println(ine.getMessage()); } return rn; } /** Subtract a rational number from this rational */ public RationalNumber subtract(RationalNumber secondRational) { RationalNumber rn = null; int n = numerator*secondRational.getDenominator() - denominator*secondRational.getNumerator(); int d = denominator*secondRational.getDenominator(); try{ rn = new RationalNumber(n,d); } catch(IrrationalNumberException ine){ System.out.println(ine.getMessage()); } return rn; } /** Multiply a rational number to this rational */ public RationalNumber multiply(RationalNumber secondRational) { RationalNumber rn = null; int n = numerator*secondRational.getNumerator(); int d = denominator*secondRational.getDenominator(); try{ rn = new RationalNumber(n,d); } catch(IrrationalNumberException ine){ System.out.println(ine.getMessage()); } return rn; } /** Divide a rational number from this rational */ public RationalNumber divide(RationalNumber secondRational) throws IrrationalNumberException{ if (secondRational.getNumerator() == 0) { throw new IrrationalNumberException("Trying to divide by 0. ",secondRational.numerator, secondRational.denominator); } int n = numerator*secondRational.getDenominator(); int d = denominator*secondRational.getNumerator(); return new RationalNumber(n, d); } /** Override the toString() method */ public String toString() { if (denominator == 1) return numerator + ""; else return numerator + "/" + denominator; } } class IrrationalNumberException extends Exception { public int numerator; public int denominator; public IrrationalNumberException(String message, int numerator, int denominator) { super(message); this.numerator = numerator; this.denominator = denominator; } public String getMessage() { return super.getMessage() + "\n" + "numerator = "+ numerator + " and denominator = " + denominator; } } class Driver { public static void main(String args[]) { System.out.println("The result is " + performDivide()); } public static RationalNumber performDivide() { RationalNumber r1 = null, r2 = null, r3 = null; while(r3 == null) { try { System.out.println("Enter the first numerator, then first denominator..."); r1 = new RationalNumber(UserInput.readInt(), UserInput.readInt()); System.out.println("Enter the second numerator, then second denominator..."); r2 = new RationalNumber(UserInput.readInt(), UserInput.readInt()); r3 = r1.divide(r2); System.out.println(r3.toString()); } catch(IrrationalNumberException e) { System.out.println(e.getMessage()); System.out.println("Exit (e)"); System.out.println("Return (r)"); System.out.println("Try Again (t)"); System.out.print("\nChoice? "); char choice = UserInput.readChar(); if (choice == 'e') { System.out.println("Exiting..."); System.exit(0); } else if (choice == 'r') { System.out.println("Returning..."); try{ r1 = new RationalNumber(0,1); } catch(IrrationalNumberException ine){ System.out.println(ine.getMessage() + "\n" + r3.toString()); } return r1; } } finally { System.out.println("Finally is executed in any case!"); } } return r3; } }