为二次公式求解器创建自定义异常处理程序

时间:2015-05-08 21:25:41

标签: java exception

您好我正在尝试为二次公式求解器创建自定义异常处理程序。我拥有的异常处理类意味着随时抛出答案b * b - 4 * a * c为负数,看起来像这样...

public class NegativeDiscriminantException extends Exception {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public NegativeDiscriminantException(String a){
        System.out.println(a);
        Quadratic.solver();
    }
}

“Quadratic.solver();”旨在从头开始重新启动变量查询过程。但这是我从Quadratic类解决它的方法......

static public double root( double A, double B, double C ) 
       throws IllegalArgumentException, ArithmeticException, NegativeDiscriminantException {
   try{
       if (A == 0.0) {
           throw new ArithmeticException();
       }
   }
   catch (ArithmeticException e){
       System.out.println("'A' can't be zero.");
       solver();
   }

   double disc = B*B - 4*A*C;
   try{
      if (disc < 0){
          throw new NegativeDiscriminantException("The discriminant is negative.");
      }
   }
   catch (NegativeDiscriminantException e){
      System.out.println("The discriminant is negative.");
   }
   return  (-B + Math.sqrt(disc)) / (2*A);
}

我收到编译错误......

  

线程“main”中的异常java.lang.Error:未解析的编译   问题:未处理的异常类型NegativeDiscriminantException at   Quadratic.solver(Quadratic.java:62)at   Quadratic.main(Quadratic.java:34)

我是使用自定义异常处理程序的新手。你能帮我解决我做错的事吗?

3 个答案:

答案 0 :(得分:2)

这不是您如何使用例外。这个想法是,如果出现异常情况,你抛出异常并且你的类的调用者必须处理它(或重新抛出它)。你没有抓住你刚才扔的异常。所以摆脱你的catch条款(以及周围的try)。

您的异常类也很糟糕。它不应该对描述异常以外的任何事情负责。让来电者决定做什么。所以摆脱对Quadratic.solver();的呼吁。

编译错误是因为调用root的任何代码都需要捕获异常,或者在其签名中添加throws声明。

答案 1 :(得分:0)

NegativeDiscriminantException是一个已检查的Exception,因此您必须对可能在try / catch中抛出此异常的方法进行任何调用(或声明调用方法以抛出它以便可以捕获它上游)。

try{
    root(...);
}catch(NegativeDiscriminantException e){
    e.printStackTrace();//
    Quadratic.solver();//placed here rather than within the Exception constructor
}

如果您不想在try / catch中发出调用(或声明调用者抛出异常),请使用unchecked Exception(例如NegativeDiscriminantException延长RuntimeException,尽管我建议阅读&#39; controversy&#39;,我建议不要求Exception执行除定义发生的问题之外的任何其他任务。

答案 2 :(得分:0)

错误的根本原因是@copeg提到您没有处理异常构造函数中Quadratic.solver()调用可能抛出的异常。

但是,您对异常的使用是相当特殊的。发明异常是为了能够处理正确级别的错误,并且能够在不使用goto语句的情况下摆脱嵌套代码。

您还在异常处理代码中调用solver()方法,看起来它正在递归。迟早会导致程序耗尽堆栈空间。

最好在求解器方法中处理异常,这样你就可以在那里循环。

public double solver() {
    boolean isAnswered = false;
    double answer;

    while (!isAnswered) {
        double a = askCoefficient("A:");
        double b = askCoefficient("B:");
        double c = askCoefficient("C:");

        try {
            answer = root(a,b,c);
            isAnswered = true;
        } catch (Exception e) {
            System.out.println("ERROR: " + e);
        }
    }

    return answer
}

public double root( double A, double B, double C ) throws ArithmeticException, NegativeDiscriminantException {
   if (A == 0.0) {
       throw new ArithmeticException();
   }

   double disc = B*B - 4*A*C;
   if (disc < 0){
       throw new NegativeDiscriminantException("The discriminant is negative.");
   }

   return  (-B + Math.sqrt(disc)) / (2*A);
}

现在可以处理异常,逻辑可以处理它们。