我正在努力解决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
我真的不明白这个错误是什么,我应该如何正确解决?
答案 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 ");
}
}