【问题标题】:What does "Type mismatch: cannot convert from null to double" mean?“类型不匹配:无法从 null 转换为 double”是什么意思?
【发布时间】:2013-06-26 13:51:53
【问题描述】:

我正在尝试解决来自 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

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

【问题讨论】:

    标签: java


    【解决方案1】:

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

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

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

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

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

    实施不当。有很大的改进空间。

    【讨论】:

    • 虽然这都是很好的建议,但它对回答问题没有任何帮助。您应该指出错误是 double 不能是 null 因为它是原始数据类型,正如其他答案所指出的那样。
    • 是的,我知道,我会尽力的。
    • 我想说告诉 OP 移动支票是对这个问题的回答。如果判别式是否定的,也许应该返回一些指标值。关于 SO 的答案并不总是针对 OP。在他/她离开后,他们还活着。
    【解决方案2】:

    从返回 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 "); 
            } 
        }
    

    【讨论】:

      【解决方案3】:

      您需要了解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-boxedDoubles) 但这对你没有好处。你想要一个更好的错误处理策略(其中有很多......一些可能性是抛出异常,使用Optional返回类型,使用标志值,例如not-a-number aka Double.NaN)。

      【讨论】:

        【解决方案4】:

        您断言该方法应该返回一个 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;
        

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2020-06-01
            • 1970-01-01
            • 2013-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-05
            • 1970-01-01
            • 2013-05-30
            相关资源
            最近更新 更多