我从计算机科学专业毕业的第一年开始就学习Java。我正在编写一个解决二次方程式的基本程序。当程序中存在if语句时,我遇到了变量无法初始化的问题。这是无法编译的代码:
public class Test
{
public static void main(String[] args)
{
String input;
do
{
Scanner in = new Scanner(System.in);
System.out.println("A: ");
double a = in.nextDouble();
System.out.println("B: ");
double b = in.nextDouble();
System.out.println("C: ");
double c = in.nextDouble();
if ((a == 0) && (b == 0) && (c == 0))
{
System.out.println("No solutions to quadratic formual with these inputs!");
continue;
}
double d = b * b - 4*a*c;
double x1 = (-b - Math.sqrt(d)) / (2 * a);
double x2 = (-b + Math.sqrt(d)) / (2 * a);
System.out.println(x1);
System.out.println(x2);
System.out.println("Continue? ");
input = in.next();
}
while (input.equals("Y"));
}
}
如果删除if语句,它将正确编译。如果我给String输入一个默认值“”,它也可以正常工作(包括if语句)。为什么是这样?这看似基本,但我无法终生解决!
答案 0 :(得分:1)
input = in.next();
语句的计算结果为if
,则从不会执行 true
(因为if
语句的主体包含一个continue
语句,该语句会跳转到while
循环的结尾),因此while
循环的条件无法测试此变量(可能未初始化)。
您可以通过将输入初始化为空的String
来避免此错误:
String input = "";
作为替代方案,如下更改逻辑可能更有意义,因为您可能希望显示“继续?”。即使数字输入都是0
也会引起疑问。
public static void main(String[] args)
{
String input;
do
{
Scanner in = new Scanner(System.in);
System.out.println("A: ");
double a = in.nextDouble();
System.out.println("B: ");
double b = in.nextDouble();
System.out.println("C: ");
double c = in.nextDouble();
if ((a == 0) && (b == 0) && (c == 0)) {
System.out.println("No solutions to quadratic formual with these inputs!");
} else {
double d = b * b - 4*a*c;
double x1 = (-b - Math.sqrt(d)) / (2 * a);
double x2 = (-b + Math.sqrt(d)) / (2 * a);
System.out.println(x1);
System.out.println(x2);
}
System.out.println("Continue? ");
input = in.next();
}
while (input.equals("Y"));
}
答案 1 :(得分:1)
您已经声明了变量input
,直到do-while块的最后一条语句才初始化。如果在此语句之前引入了continue
的可能性,则在条件中引用input
时可能会被初始化。
不是if
语句会导致此错误;这是continue
语句。
我将删除continue
并将解决方案计算放在else
块中,以避免除以0。然后,我确保要求用户继续的最后2条语句超出了if / else以确保在评估input
条件时初始化while
。
if ((a == 0) && (b == 0) && (c == 0))
{
System.out.println("No solutions to quadratic formula with these inputs!");
}
else
{
double d = b * b - 4*a*c;
double x1 = (-b - Math.sqrt(d)) / (2 * a);
double x2 = (-b + Math.sqrt(d)) / (2 * a);
System.out.println(x1);
System.out.println(x2);
}
System.out.println("Continue? ");
input = in.next();
}
while (input.equals("Y"));
您可能还想检测判别式是否小于零,以表明没有实际解或给出复杂解。
您可能还想检测是否仅a
是0
并求解线性方程。