“类型不匹配:无法从空转换为双”是什么意思?

时间:2013-06-28 17:43:48

标签: java

我正在努力解决Art& amp; 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

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

5 个答案:

答案 0 :(得分:5)

您需要了解difference between primitive types (e.g., double) and boxed object types (e.g., capital-D Double)。鉴于Double是对象的引用(因此可以是null),double是基元,不能是null

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

当然,您可以通过将返回类型更改为Double来解决问题(这会使null返回合法,并导致您的原始双打成为 auto-boxed进入Double s),但这对你没有好处。你想要一个更好的错误处理策略(其中有很多......一些可能性是抛出异常,使用Optional返回类型,使用一个标志值,例如not-a-number aka {{1} })。

答案 1 :(得分: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;

答案 2 :(得分:0)

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

尽管quadratics有两个根,但你返回一个双。你不回来的那个怎么样?

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

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

你的等式是以天真的方式实现的,忽略了数字问题。

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

答案 3 :(得分:0)

由于您似乎想要计算等式的真实解,您应该考虑抛出异常。

您不能返回null,因为当您想要返回double时,它只能用于引用,这是一种原始数据类型

答案 4 :(得分: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 "); 
        } 
    }