如果存在if语句,则Java编译代码不同/变量未初始化

时间:2018-07-12 18:12:25

标签: java compiler-errors initialization

我从计算机科学专业毕业的第一年开始就学习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语句)。为什么是这样?这看似基本,但我无法终生解决!

2 个答案:

答案 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"));

您可能还想检测判别式是否小于零,以表明没有实际解或给出复杂解。

您可能还想检测是否仅a0并求解线性方程。