2

我正在尝试解决来自 Java 的艺术与科学的练习,二次方程的解决方案。

import acm.program.*;

public class QuadraticEquation extends ConsoleProgram {
  public void run(){
    println("Enter coefficients for quadratic equation");
    int a = readInt("Enter first number: ");
    int b = readInt("Enter second number: ");
    int c = readInt("Enter third number: ");

    double result = quadratic(a,b,c);

    println("The first solution is: " + result);
  }

  private double quadratic(int a, int b, int c){
    double underSquare = (b*b-4*a*c);
    double x = (-b+Math.sqrt(b*b-(4*a*c)))/(2*a);
    if (underSquare < 0) {
        return null;
    } else {
      return (x);
    }
  }
}

我有一个错误: return null; 说:

类型不匹配:无法从 null 转换为 double

我真的不明白这个错误是什么,我应该如何正确解决这个问题?

4

5 回答 5

5

您需要了解原始类型(例如, )和装箱对象类型(例如,大写-D )之间的区别doubleDouble。是对对象Double的引用(因此可以是null),double是原始的,不能是null

编译器告诉您,您将函数的返回类型声明为double,因此null不能转换为double.

当然,您可以通过将返回类型更改为来“解决”问题Double(这将使null返回合法,并导致您的原始双打 自动装箱Doubles),但这并不能真正为您服务。您想要一个更好的错误处理策略(其中有很多......一些可能性是抛出异常,使用Optional返回类型,使用标志值,例如 not-a-number aka Double.NaN)。

于 2013-06-28T17:54:56.617 回答
2

您断言该方法应返回 double 类型的原语,而不是返回一个 null 值,该值与该方法的规定合同不匹配。

你想在这里做什么完全取决于你想如何捕捉这种错误,这里有许多不同的解决方案是正确的,但抛出一个空对象不是其中之一。

还值得注意的是,在您显示的示例中:

double underSquare = (b*b-4*a*c);
double x = (-b+Math.sqrt(b*b-(4*a*c)))/(2*a);
if (underSquare < 0) {
    return null;
} else {
  return (x);
}

应该:

double underSquare = (b*b-4*a*c);
double x = (-b+(Math.sqrt(underSquare)))/(2*a);
return x;

这相当于:

double underSquare = (b*b-4*a*c);
double x = (-b+Math.sqrt(b*b-(4*a*c)))/(2*a);
if (underSquare < 0) {
    return double.NaN;
} else {
  return (x);
}

但更具可读性。

Java 足够聪明,知道它不应该取负数的平方根,所以如果你在两种情况下都返回 x,代码应该运行得很好。也就是说,您还应该尝试在此处捕获任何异常。由于在直接评估数字时可能会出现很多错误,因此您应该尝试以下方法:

double underSquare = (b*b-4*a*c);
try{
    double x = (-b+(Math.sqrt(underSquare)))/(2*a);
} catch (Exception e){
    throw e;
} finally {
    return x
}
return x;
于 2013-06-28T17:47:22.460 回答
0

为什么在取平方根后检查负行列式?这是没有意义的。在你做之前检查。

尽管二次方程有两个根,但您返回一个双精度数。不退的那一个呢?

在这种情况下,结果是两个复共轭根。您当然可以编写一个Complex类并返回两个根。

您不检查特殊情况(例如 a = 0、b = 0、c =0)。你应该。

您的方程式以天真的风格实现,忽略了数字问题。

执行不力。有很大的改进空间。

于 2013-06-28T17:49:22.497 回答
0

从返回 null 到 double 方法,您的代码几乎没有问题...我已经修改了您的程序,将其与您的程序进行比较,如果您有任何问题,请在我的答案中添加评论,我会尽力而为来帮助你。

public static void main(String[] args) {
        run();
    }
    static  void run(){
        System.out.println("Enter coefficients for quadratic equation");
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Enter first number: ");
        Double a = keyboard.nextDouble();
        System.out.println("Enter second number: ");
        Double b = keyboard.nextDouble();
        System.out.println("Enter third number: ");
        Double c = keyboard.nextDouble();

        resultParta(a,b,c);


    }
    public static void resultParta(Double a, Double b, Double c) {
        double discriminant = Math.pow(b,2) - 4*a*c; 
        double answer1 = (-b + Math.sqrt(discriminant))/(2*a); 
        double answer2 = (-b - Math.sqrt(discriminant))/(2*a); 

        if(discriminant > 0) 
        { 
            System.out.println("answer1: " + answer1); 
            System.out.println("answer2: " + answer2); 
        } 
        else if(discriminant == 0) 
        { 
            System.out.println("answer2: " + answer1); 
        } 
        else 
        { 
            double root1complex = -b/(2*a); 
            double root1complex2 = Math.sqrt(-discriminant)/(2*a); 

            System.out.println(root1complex + " + " + root1complex2 + " i "); 
            System.out.println(" "); 
            System.out.println(root1complex + " - " + root1complex2 + " i "); 
        } 
    }
于 2013-06-28T18:33:18.553 回答
0

由于您似乎愿意计算方程的真实解,因此您可能应该考虑抛出异常。

您不能返回 null,因为它只能与引用一起使用,而您想返回一个 double,这是一种原始数据类型

于 2013-06-28T17:51:17.740 回答