所以编译器说我的第二个打印行语句中的英寸变量需要初始化。这是为什么?为什么我不能将变量保留为未知变量?当我没有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);
}
}
答案 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
永远不会被初始化。
有许多解决方案:
如果您有结果,只打印结果:
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.");
}
循环直到获得有效结果:
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;
...
在这两种情况下,如果没有初始化,inches
将不会被使用,这将满足编译器。
答案 4 :(得分:0)
要使if
块能够继续执行脚本,它需要能够得出结论。你写过
if (var < IntValue) {
do some stuff
}
并且您没有给var
一个值。评估如何完成?您没有添加其他测试来检查var
null
是var
,这是您目前var
的目标。如果您不想为if
分配值并且想要Arel::Nodes::Multiplication.new(Inventory.arel_table[:available].sum, 3).to_sql
=> "SUM(\"inventories\".\"available\") * 3"
阻止,请添加该检查。