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

Java 为二次公式解算器创建自定义异常处理程序,java,exception,Java,Exception,嗨,我正在尝试为二次公式解算器创建一个自定义异常处理程序。我使用的异常处理类是为了在b*b-4*a*c为负时抛出答案,看起来像这样 public class NegativeDiscriminantException extends Exception { /** * */ private static final long serialVersionUID = 1L; public NegativeDiscriminantException(S

嗨,我正在尝试为二次公式解算器创建一个自定义异常处理程序。我使用的异常处理类是为了在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);
}
静态公共双根(双A、双B、双C)
抛出IllegalArgumentException、算术Exception、NegativeDescriptionAntException{
试一试{
如果(A==0.0){
抛出新的算术异常();
}
}
捕获(算术异常){
System.out.println(“'A'不能为零”);
解算器();
}
双圆盘=B*B-4*A*C;
试一试{
如果(圆盘<0){
抛出新的NegativeDiscriminantException(“判别式为否定”);
}
}
捕获(否定描述异常e){
System.out.println(“判别式为负”);
}
返回(-B+数学sqrt(disc))/(2*A);
}
我得到一个编译器错误

线程“main”java.lang中出现异常。错误:未解析编译 问题:位于的未处理异常类型NegativeDiscriminantException squared.solver(squared.java:62)位于 squared.main(squared.java:34)


我是使用自定义异常处理程序的新手。你能帮我纠正一下我做错了什么吗?

NegativeDiscriminantException
是一个选中的
异常
,因此你必须对可能在try/catch中引发此异常的方法进行任何调用(或者声明调用方方法来引发它,以便可以在上游捕获它)


如果您不想在try/catch中进行调用(或声明调用方抛出异常),请使用
未选中的异常
(例如have
NegativeDiscriminantException
extend
RuntimeException
,尽管我建议阅读有关“”的内容,并且我不建议要求异常执行除定义发生的问题之外的任何其他任务)这不是使用异常的方式。我们的想法是,如果出现异常情况,您抛出异常,并且类的调用方必须处理(或重新抛出)。您不会捕获刚刚抛出的异常。因此,请摆脱您的
catch
子句(以及周围的
try

您的异常类也很糟糕。它除了描述异常之外,不应该负责任何其他事情。让调用方决定要做什么。因此,不要调用
Quadratic.solver();


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

错误的根本原因是@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);
}
公共双解算器(){ 布尔值isAnswered=false; 双重回答; 当(!我回答){ 双a=askCoefficient(“a:”); 双b=askCoefficient(“b:”); 双c=askCoefficient(“c:”); 试一试{ 答案=根(a、b、c); isAnswered=true; }捕获(例外e){ System.out.println(“错误:+e”); } } 回覆 } 公共双根(双A,双B,双C)抛出算术异常,NegativeDiscriminantException{ 如果(A==0.0){ 抛出新的算术异常(); } 双圆盘=B*B-4*A*C; 如果(圆盘<0){ 抛出新的NegativeDiscriminantException(“判别式为否定”); } 返回(-B+数学sqrt(disc))/(2*A); }
现在可以在逻辑可以处理异常的地方处理异常。

如果您希望它不被检查,请将类型更改为
RuntimeException
,否则您需要在try块内调用
root
。非常感谢大家。这非常有帮助!
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);
}