Java:异常处理我的catch()有问题
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);
}
}
# 1 楼答案
你说过Divide抛出FractionDivideByZeroException
但是要编写代码以确保它不会发生。编译器不知道这一点,因此抱怨您/没有在调用代码中处理异常
# 2 楼答案
看看你的方法签名:
它说它抛出了异常。main方法无法捕获它,因此编译器会抱怨
在方法中捕获它或声明抛出它,但不能两者兼而有之
我认为你的逻辑有缺陷。你应该永远不要能够创建一个分母为零的分数-你的构造函数应该检查一下
您的divide()方法应该进行检查,以确保除数的分子不是零。这是得到除零误差的唯一方法
当构造除法返回的新分数时,构造函数应该抛出一个异常
不要在divide()方法中捕捉它;保留throws子句并删除try/catch。如果它是一个已检查的异常,您的测试用例必须捕获它
以下是我的写作方式:
部分单元测试:
# 3 楼答案
将try/catch块添加到主方法中
FractionDevidedByZeroException
是一个已检查的异常。你应该用try/catch来包围他们。否则会出现编译错误# 4 楼答案
您声明
devide
是一个抛出FractionDivideByZeroException
的方法测试函数必须捕获它
或函数不会引发此异常,因此
throws FractionDivideByZeroException
是多余的# 5 楼答案
从divide方法中去掉抛出声明。你把它扔出去,然后自己处理
你的FractionTest使用frac1。divide,编译器要求您处理divide方法中声明的异常