Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java以不同方式编译代码/存在if语句时不初始化变量_Java_Compiler Errors_Initialization - Fatal编程技术网

Java以不同方式编译代码/存在if语句时不初始化变量

Java以不同方式编译代码/存在if语句时不初始化变量,java,compiler-errors,initialization,Java,Compiler Errors,Initialization,在我主修计算机科学的第一年之后,我专门使用Python学习Java。我正在做一个解二次方程的基本程序。当程序中存在if语句时,我遇到变量未初始化的问题。以下是未编译的代码: public class Test { public static void main(String[] args) { String input; do { Scanner in = new Scanner(System.in);

在我主修计算机科学的第一年之后,我专门使用Python学习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语句,它将正确编译。如果我给字符串输入一个默认值“”,它也可以正常工作(包括If语句)。为什么会这样?这看起来很基本,但我一辈子都搞不懂

input=in.next()if
语句的计算结果为
true
(因为
if
语句的主体包含一个
continue
语句,该语句在
while
循环的迭代过程中跳过到
的末尾),因此
while
循环的条件无法测试该变量(可能未初始化)

通过将输入初始化为空的
字符串
,可以避免此错误:

String input = "";
另一种选择是,如下更改逻辑可能更有意义,因为即使数字输入都是
0
,您也可能希望显示“Continue?”问题

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"));
}
input=in.next()if
语句的计算结果为
true
(因为
if
语句的主体包含一个
continue
语句,该语句在
while
循环的迭代过程中跳过到
的末尾),因此
while
循环的条件无法测试该变量(可能未初始化)

通过将输入初始化为空的
字符串
,可以避免此错误:

String input = "";
另一种选择是,如下更改逻辑可能更有意义,因为即使数字输入都是
0
,您也可能希望显示“Continue?”问题

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

您已经声明了一个变量
input
,该变量直到do while块的最后一个语句才初始化。如果在此语句之前引入了
continue
的可能性,则在条件中引用时,
input
可能会被取消初始化

导致此错误的不是
if
语句;这是
continue
语句

我会删除
continue
并将解算放在
else
块中,以避免除以0。然后,我将确保请求用户继续的最后两条语句已超过if/else,以确保在计算
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
,并求解线性方程。

您声明了一个变量
输入
,该变量直到do while块的最后一个语句才初始化。如果在此语句之前引入了
continue
的可能性,则在条件中引用时,
input
可能会被取消初始化

导致此错误的不是
if
语句;这是
continue
语句

我会删除
continue
并将解算放在
else
块中,以避免除以0。然后,我将确保请求用户继续的最后两条语句已超过if/else,以确保在计算
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
,并求解线性方程