2013-10-17 58 views
1

好吧,所以對於學校我必須目前做一個程序,可以處理理性數字算術。我完成了代碼的這部分工作,但分配的次要部分是創建兩個自定義異常類。第一個異常類很容易創建,只是一個空對象處理類。但我無法弄清楚的是零級別的習俗劃分。問題是,我們已經爲類是具體參數:試圖做一個自定義的RuntimeException類

Class - DivideByZeroException 
Constructors - DivideByZeroException(), DivideByZeroException (Rational rational) 
Instance Fields - Rational rational 
Public Methods - Rational getRational() - String getMessage() : override 

我遇到的問題是,我沒有任何想法,爲什麼它需要覆蓋的getMessage上課的時候必須這樣繼承RuntimeException啓用超級(消息)呼叫。以下是可以拋出異常的類的源代碼以及應該處理它們的類。我可能會有一些奇怪的代碼,我現在正在嘗試,所以如果某件事情沒有意義,那可能會讓我感到沮喪。

package com.math.rational; 

public class DivideByZeroException extends RuntimeException 
{ 
    private Rational rational; 

    DivideByZeroException() 
    { 
     super(); 
    } 

    DivideByZeroException(Rational rational) 
    { 
     super(); 
     this.rational = rational; 
    } 

    public Rational getRational() 
    { 
     try 
     { 
     return this.rational; 
     } 
     catch(NullPointerException e) 
     { 
      e.printStackTrace(); 
      System.out.println("You have no rational object to retrieve"); 
      System.exit(1); 
      return null; 
     } 
    } 

    @Override 
    public String getMessage() 
    { 
     if(this.rational != null) 
     { 
      return this.rational.toString(); 
     } 
     else 
     { 
      return new String("You attempted to divide by zero"); 
     } 
    } 
} 


package com.math.rational; 

public class Rational 
{ 
    private int numerator; 
    private int denominator; 

    public Rational(int numerator, int denominator) 
    { 

     try 
     { 
      this.numerator = numerator; 
      this.denominator = denominator; 

      int[] intHolder = simplify(this.numerator, this.denominator); 
      this.numerator = intHolder[0]; 
      this.denominator = intHolder[1]; 

      if (this.denominator == 0 || denominator == 0) 
      { 
       System.out.println("true"); 
       throw new DivideByZeroException(new Rational(this.numerator, this.denominator)); 
      } 
     } 

     catch (DivideByZeroException e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 

    public Rational(Rational numerator, Rational denominator) 
    { 
     try 
     { 
     numerator.multiply(denominator.reciprocalNumber()); 

     if (numerator.denominator == 0 || denominator.denominator == 0) 
     { 
      System.out.println("true"); 
      throw new DivideByZeroException(new Rational(this.numerator, this.denominator)); 
     } 
     } 
     catch(DivideByZeroException e) 
     { 
      System.out.println(e.getMessage()); 
     } 
    } 

    public int[] simplify(int tempNumerator, int tempDenominator) 
    { 
     int reduce = greatestCommon(getAbs(tempNumerator), tempDenominator); 

     tempNumerator /= reduce; 
     tempDenominator /= reduce; 
     int[] size = {tempNumerator, tempDenominator}; 

     for(int i : size) 
     { 
      System.out.printf("%s ", i); 
     } 
     return size; 
    } 

    public int greatestCommon(int first, int second) 
    { 
     while(first != second) 
     { 
      if(first > second) 
      { 
       first -= second; 
      } 
      else 
      { 
       second -= first; 
      } 
     } 

     return first; 
    } 

    public Rational reciprocalNumber() 
    { 
     return new Rational(this.denominator, this.numerator); 
    } 

    public int getAbs(int value) 
    { 
     return Math.abs(value); 
    } 

    public Rational add(Rational other) 
    { 

     if(other.getDenominator() != this.getDenominator()) 
     { 
      int commonDenom = this.getDenominator() * other.getDenominator(); 
      int firstNumerator = numerator * other.getDenominator(); 
      int secondNumerator = other.getNumerator() * this.getDenominator(); 
      int finalNumerator = firstNumerator + secondNumerator; 
      return new Rational(finalNumerator, commonDenom); 
     } 
     else if(other.getDenominator() == this.getDenominator()) 
     { 
      int finalNumerator = this.getNumerator() + other.getNumerator(); 
      return new Rational(finalNumerator, this.getDenominator()); 
     } 
     else 
     { 
      System.out.println("LINE 90 EXECUTED WHICH MEANS SOMETHING IS WRONG"); 
      return new Rational(this.getNumerator(), this.getDenominator()); 
     } 

    } 

    public Rational subtract(Rational other) 
    { 
     return add(new Rational(-other.numerator, other.denominator)); 
    } 

    public Rational divide(Rational other) 
    { 
     return multiply(other.reciprocalNumber()); 
    } 

    public Rational multiply(Rational other) 
    { 
     int newNumerator = this.getNumerator() * other.getNumerator(); 
     int newDenominator = this.getDenominator() * other.getDenominator(); 
     return new Rational(newNumerator, newDenominator); 
    } 

    public int getNumerator() 
    { 
     return this.numerator; 
    } 

    public void setNumerator(int numerator) 
    { 
     this.numerator = numerator; 
    } 

    public int getDenominator() 
    { 
     return this.denominator; 
    } 

    public void setDenominator(int denominator) 
    { 
     this.denominator = denominator; 
    } 

    @Override 
    public String toString() 
    { 
     String answer; 

     if(denominator == 1) 
     { 
      answer = numerator + ""; 
     } 
     else 
     { 
      answer = numerator + "/" + denominator; 
     } 
     return answer; 
    } 

} 

唯一的其他類實際上只是測試值的驅動類。

+0

你必須覆蓋它,這樣你可以有一個自定義輸出消息。 – fvrghl

+0

我知道了。但事情是你可以用一個字符串arg來調用你的super。如super(「你不能被零除」); –

+0

那麼,你在'getMessage'方法中做了一些額外的邏輯 – fvrghl

回答

0

定義自定義運行時異常的例子:

public static int divide(x,y) { 
    double result; 
    if (y==0) { 
    throw new CustomException("Cannot divide by 0"); 
    } 
    else { 
    result = x/y; 
    } 
    return result; 
} 

public class CustomException extends RuntimeException { 
    public CustomException (String errorMsg) { 
    super(errorMsg); 
} 
+0

哎呀!你檢查x爲0,然後除以y? – Ingo

+0

oooops,當你在聲望點之後運行時會發生這種情況:P。 tnx指出它(*現在感覺有點尷尬*) –

相關問題