Java: обработка исключений - что-то не так с моим catch () - PullRequest
0 голосов
/ 25 ноября 2010
    public class Fraction {
    private int numerator; //  
    private int denominator; // 

    Fraction(int nume, int denom)
    {
        numerator = nume;
        denominator = denom;
    }

     public Fraction divide(Fraction other ) throws FractionDivideByZeroException
    {       

         int nume=0, denom=0;
         try {              
                nume = (this.numerator * other.denominator);
                denom = (this.denominator*other.numerator);
                if(nume!=0 && denom==0) throw new FractionDivideByZeroException();
                return new Fraction(nume, denom);
            } catch (FractionDivideByZeroException e) {             
                e.printError();             
            }       
            return new Fraction(nume, denom);               
    }


}
class FractionDivideByZeroException extends Exception
{
    void printError()
    {
        System.out.println("You can not divide by zero!");
    }
}

это тестовый класс:

public class FractionTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Fraction frac1 = new Fraction(1,2);
        Fraction frac2 = new Fraction(1,3);

        Fraction frac3 = frac1.divide(frac2); // here's the error message saying "Unhandled exception type FractionDivideByZeroException"
        System.out.println(frac3);

    }



}

Ответы [ 5 ]

2 голосов
/ 25 ноября 2010

Извлеките броски декларации из вашего метода деления. Вы бросаете это и затем обрабатываете это там непосредственно.

Ваш FractionTest использует frac1.divide, и компилятор просит вас обработать исключение, которое объявлено в методе разделения.

1 голос
/ 25 ноября 2010

Посмотрите на подпись вашего метода:

 public Fraction divide(Fraction other ) throws FractionDivideByZeroException

Он говорит, что выбрасывает исключение. Основной метод не улавливает его, поэтому компилятор будет жаловаться.

Поймай это в методе или объяви, что ты бросаешь это, но не оба.

Я думаю, что ваша логика ошибочна. Вы не должны никогда создавать фракцию с нулевым знаменателем - ваш конструктор должен это проверить.

Ваш метод split () должен проверять, чтобы числитель делителя отличался от нуля. Это единственный способ получить ошибку деления на ноль.

Когда вы создаете новую Fraction, которая разделяет возвращаемые значения, конструктор должен выдать исключение.

Не ловите это в вашем методе Поделись (); оставьте пункт о бросках и удалите попытку / улов. Если это проверенное исключение, ваш контрольный пример должен его перехватить.

Вот как бы я это написал:

package fraction;

public class Fraction implements Comparable
{
    private int numerator;
    private int denominator;

    public Fraction()
    {
        this(0);
    }

    public Fraction(int numerator)
    {
        this(numerator,1);
    }

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

        this.numerator = numerator;
        this.denominator = denominator;
        if (this.numerator*this.denominator < 0)
        {
            this.numerator = -Math.abs(this.numerator);
            this.denominator = Math.abs(this.denominator);
        }
        this.normalize();
    }

    public Fraction add(Fraction other)
    {
        return new Fraction(this.numerator*other.denominator+other.numerator*this.denominator, this.denominator*other.denominator);
    }

    public Fraction sub(Fraction other)
    {
        return new Fraction(this.numerator*other.denominator-other.numerator*this.denominator, this.denominator*other.denominator);
    }

    public Fraction mul(Fraction other)
    {
        return new Fraction(this.numerator*other.numerator, this.denominator*other.denominator);
    }

    public Fraction div(Fraction other)
    {
        return new Fraction(this.numerator*other.denominator, this.denominator*other.numerator);
    }

    @Override
    public boolean equals(Object o)
    {
        if (this == o)
        {
            return true;
        }
        if (o == null || getClass() != o.getClass())
        {
            return false;
        }

        Fraction fraction = (Fraction) o;

        if (denominator != fraction.denominator)
        {
            return false;
        }
        if (numerator != fraction.numerator)
        {
            return false;
        }

        return true;
    }

    @Override
    public int hashCode()
    {
        int result = numerator;
        result = 31 * result + denominator;
        return result;
    }

    public int compareTo(Object o)
    {
        Fraction other = (Fraction) o;

        int product1 = this.numerator*other.denominator;
        int product2 = other.numerator*this.denominator;

        return (product1-product2);
    }

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

    private void normalize()
    {
        int sign = 1;
        if (this.numerator < 0)
        {
            sign = -1;
        }

        int gcd = greatestCommonDivisor(Math.abs(this.numerator), Math.abs(this.denominator));
        this.numerator /= gcd;
        this.denominator /= gcd;
        this.numerator *= sign;
    }

    public static int greatestCommonDivisor(int m, int n)
    {
        int a = Math.max(m, n);
        int b = Math.min(m, n);
        if (a == 0)
            return b;
        if (b == 0)
            return a;
        while (a != b)
        {
            if (b > a)
                b -= a;
            else
                a -= b;
        }
        return b;
    }
}

И частичный юнит-тест:

package fraction;

import org.junit.Assert;
import org.junit.Test;

public class FractionTest
{
    @Test
    public void testAdd()
    {
        Fraction x = new Fraction(3, 4);
        Fraction y = new Fraction(5, 8);
        Fraction expected = new Fraction(11, 8);
        Assert.assertEquals(expected, x.add(y));
    }

    @Test
    public void testSub()
    {
        Fraction x = new Fraction(3, 4);
        Fraction y = new Fraction(5, 8);
        Fraction expected = new Fraction(1, 8);
        Assert.assertEquals(expected, x.sub(y));
    }

    @Test
    public void testMul()
    {
        Fraction x = new Fraction(3, 4);
        Fraction y = new Fraction(5, 8);
        Fraction expected = new Fraction(15, 32);
        Assert.assertEquals(expected, x.mul(y));
    }


    @Test
    public void testDiv()
    {
        Fraction x = new Fraction(3, 4);
        Fraction y = new Fraction(5, 8);
        Fraction expected = new Fraction(6, 5);
        Assert.assertEquals(expected, x.div(y));
    }

    @Test
    public void testGreatestCommonDivisor()
    {
        Assert.assertEquals(Fraction.greatestCommonDivisor(48, 180), 12);
        Assert.assertEquals(Fraction.greatestCommonDivisor(40902, 24140), 34);
        Assert.assertEquals(Fraction.greatestCommonDivisor(2, 199), 1);
        Assert.assertEquals(Fraction.greatestCommonDivisor(11, 8), 1);
        Assert.assertEquals(Fraction.greatestCommonDivisor(1, 8), 1);
        Assert.assertEquals(Fraction.greatestCommonDivisor(15, 32), 1);
        Assert.assertEquals(Fraction.greatestCommonDivisor(6, 5), 1);
    }
}
1 голос
/ 25 ноября 2010

Вы сказали, что Divide создает исключение FractionDivideByZeroException

public Fraction divide(Fraction other ) throws FractionDivideByZeroException

, но написал код, чтобы убедиться, что это не так.Компилятор не знает этого, поэтому жалуется, что вы не обработали исключение в вызывающем коде

0 голосов
/ 25 ноября 2010

Добавьте блок try / catch в ваш основной метод. FractionDevidedByZeroException является проверенным исключением. Вы должны окружить их try / catch. В противном случае вы получите эту ошибку компиляции.

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Fraction frac1 = new Fraction(1,2);
    Fraction frac2 = new Fraction(1,3);
    try { 
         Fraction frac3 = frac1.divide(frac2); 
         System.out.println(frac3);
    } catch (FractionDevidedByZeroException e) {
        e.printStackTrace();
    }

}
0 голосов
/ 25 ноября 2010

Вы указали, что devide - это метод, который выбрасывает FractionDivideByZeroException.
, ваша тестовая функция должна его перехватить.
или ... ваша функция не выдает это исключение, поэтому throws FractionDivideByZeroException является избыточным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...