变量可能尚未初始化 - 为什么我需要初始化?

时间:2015-10-10 19:39:38

标签: java syntax

所以编译器说我的第二个打印行语句中的英寸变量需要初始化。这是为什么?为什么我不能将变量保留为未知变量?当我没有if / else语句时,它可以正常工作。

import java.util.Scanner;

class FeetToInchesInputOutput {
public static void main(String[] args){

 double feet;
 double inches;
 String userFeetInput;

 Scanner input = new Scanner(System.in);

 System.out.print("How many feet do you want to convert?");
 userFeetInput = input.nextLine();
 feet = Double.parseDouble(userFeetInput);

 if (feet < 500.0) {
 inches = feet*12;
 }
else {
system.out.println("Type a number less than 500.");
}

System.out.println(feet + " feet is equal to " + inches + " inches.");
System.exit(0);
}
}

5 个答案:

答案 0 :(得分:1)

在Java中,局部变量不会自动初始化。你必须在代码中使用它之前初始化它。在你的代码中,如果condition为true,它将被初始化,但编译器不知道条件是真还是假。它在运行时决定。而在其他条件变量英寸未初始化(或者您说分配了一个值)。所以它抛出了编译错误。您甚至可以使用null初始化对象。

你必须初始化它,因为Java的创建者决定局部变量不会像类级别变量get那样获得默认值。所以你必须初始化它。

答案 1 :(得分:0)

Java不允许使用(在您的情况下 - 打印)单元化变量。在这里,如果feet大于500,则永远不会初始化inches,因此无法使用它。解决此问题的一种方法是将打印移至if语句:

if (feet < 500.0) {
    inches = feet*12;
    System.out.println(feet + " feet is equal to " + inches + " inches.");
} else {
    system.out.println("Type a number less than 500.");
}

答案 2 :(得分:0)

您需要初始化的原因是,如果if语句进入else,则inches未初始化。如果您还在inches中分配了else,则不会出现问题,inches在程序执行System.out.println(feet + " feet is equal to " + inches + " inches.");时会有一个值线。更好的方法(恕我直言)是在你第一次创建变量时分配一个值,我使用-1,这样我就知道该值不正确。

答案 3 :(得分:0)

查看程序的流程:有可能在没有变量初始化的情况下到达使用变量的行,这是禁止的。

您的观察是正确的:如果feet >= 500.0,您的inches永远不会被初始化。

有许多解决方案:

  1. 如果您有结果,只打印结果:

    if (feet < 500.0) {
        inches = feet*12;
        System.out.println(feet + " feet is equal to " + inches + " inches.");
    } else {
        system.out.println("Type a number less than 500.");
    }
    
  2. 循环直到获得有效结果:

    do {
        System.out.print("How many feet do you want to convert?");
        userFeetInput = input.nextLine();
        feet = Double.parseDouble(userFeetInput);
    
        if (feet >= 500.0) {
            system.out.println("Type a number less than 500.");
        }
    } while (feet >= 500.0);
    inches = feet*12;
    ...
    
  3. 在这两种情况下,如果没有初始化,inches将不会被使用,这将满足编译器。

答案 4 :(得分:0)

要使if块能够继续执行脚本,它需要能够得出结论。你写过

if (var < IntValue) {
   do some stuff 
}

并且您没有给var一个值。评估如何完成?您没有添加其他测试来检查var nullvar,这是您目前var的目标。如果您不想为if分配值并且想要Arel::Nodes::Multiplication.new(Inventory.arel_table[:available].sum, 3).to_sql => "SUM(\"inventories\".\"available\") * 3" 阻止,请添加该检查。