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



嗨,我正在尝试为二次公式求解器创建一个自定义外程处理程序。我拥有的例外处理课程是在任何时候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();"旨在从一开始就重新启动变量查询过程。但这是我从二次类解决的方法...

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);
}

我得到编译器错误...

线程"主" java.lang.error中的例外:未解决的汇编 问题:未经指导的异常类型negativeDiscriminantException at Quadratic.Solver(Quadratic.java:62)at quadratic.main(quadratic.java:34)

我是新来的,使用自定义处理程序。您能帮我帮助我吗?

这不是您使用异常的方式。这个想法是,如果有特殊情况,您会引发例外,并且班级的呼叫者必须处理(或重新启动)。您不会遇到例外,您只是投掷。因此,摆脱您的catch条款(以及周围的try)。

您的异常课也不好。除了描述例外,它不应对任何其他事情负责。让来电者决定该怎么做。因此,摆脱了Quadratic.solver();的电话。

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

NegativeDiscriminantException是一个检查的 Exception,因此您必须将任何调用的呼叫放在可能会在尝试/捕获中抛出此例外的方法(或声明呼叫者的方法以扔掉它,以便可以抓住它上游的)。

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

如果您不想在尝试/捕获中呼叫(或声明呼叫者抛出异常),请使用 unchecked Exception(例如,我确实建议阅读有关"争议"的 NegativeDiscriminantException扩展RuntimeException,而我建议不要求例外执行其他任何任务,除了定义发生的问题)

错误的根本原因是@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);
}

现在处理了逻辑可以处理的例外。

最新更新