与变量初始化混淆

时间:2013-09-19 22:52:42

标签: java

这是一个无法编译的代码片段。我在最后一行收到错误,声称dots_per_page变量未初始化。当我将其设置为等于所示第一行的值时,此错误消失。我有什么东西可以俯瞰吗?我不认为我必须将它设置为声明时的值。

long dots_per_page;
if (print_type == 'T' || print_type == 't') {
dots_per_page = 5000;
}       
else if (print_type == 'I' || print_type == 'i') {
dots_per_page = 10000;
}               
else {
System.out.println("You did not provide a valid option.");
}   
System.out.println(dots_per_page);

8 个答案:

答案 0 :(得分:6)

您遇到dots_per_page永远不会获得值的情况。如果print_type不是'T''t''I''i',则会打印"You did not provide a valid option"并且未设置该值。

如果在第一行中设置了默认值,则此情况将具有默认值,并且一切正常。您还可以在上一个else块中设置不同的值。

答案 1 :(得分:4)

很多这些答案都说你不能保留原始类型。这并非完全正确。您可以整天保留未设置的基本类型,但在设置之前,您不能使用该变量。您在dots_per_page电话的最后一行使用了system.out.println。如果删除该行,您还会看到您的代码将被编译。因此,您有多种方法可以解决此问题,或者为所有代码路径初始化变量,或者仅在已初始化的代码路径中使用该变量。

第二个选项的一个例子:

long dots_per_page;
if (print_type == 'T' || print_type == 't') {
dots_per_page = 5000;
System.out.println(dots_per_page);
}       
else if (print_type == 'I' || print_type == 'i') {
dots_per_page = 10000;
System.out.println(dots_per_page);
}               
else {
System.out.println("You did not provide a valid option.");
}   
//System.out.println(dots_per_page); comment out this line

编辑:以及刚刚来到我的第三个选项:在else案例中退出你的方法

long dots_per_page;
if (print_type == 'T' || print_type == 't') {
dots_per_page = 5000;
}       
else if (print_type == 'I' || print_type == 'i') {
dots_per_page = 10000;
}               
else {
System.out.println("You did not provide a valid option.");
return;
}   
System.out.println(dots_per_page);

答案 2 :(得分:3)

Java Tutorial: Primitive Data Types

  

声明字段时并不总是需要指定值。声明但未初始化的字段将由编译器设置为合理的默认值。一般来说,此默认值将为零或null,具体取决于数据类型。但是,依赖于这样的默认值通常被认为是糟糕的编程风格。

Data type default values

  

局部变量略有不同;编译器永远不会为未初始化的局部变量分配默认值。如果无法初始化声明它的局部变量,请确保在尝试使用它之前为其赋值。访问未初始化的局部变量将导致编译时错误。

答案 3 :(得分:1)

一开始就这样做:

long dots_per_page = 0;

所有局部变量必须在Java中显式初始化,编译器抱怨,因为有一个执行路径没有为变量赋值:如果else条件成立,{{1}的值是多少}}?或者,您可以将其添加到dots_per_page块:

else

重点是:无论运行什么执行路径,如果要读取本地变量,必须将总是分配给它。只有属性具有默认值。

答案 4 :(得分:1)

如果 print_type 是String,则需要使用双引号,并且需要使用“.equals()”方法来比较它们。如上所述,如果它是 char ,您的代码应该可以正常工作。

此外,如果结果不是“我”或“T”(或它们的小写版本), dots_per_page 在程序结束时没有值。

else {
    System.out.println("You did not provide a valid option.");
    dots_per_page = -1;
};

这样的事情(不可能的回报)会告诉你出了什么问题。

初始化您知道程序应该使用不应该更改的变量的变量,有助于显示程序是否正常运行。

答案 5 :(得分:0)

dots_per_page是primitive type,因此不允许取消设置。只是 使用long dots_per_page =0;或者long dots_per_page = -1;开头。

另一个选项是在dots_per_page = 0;块中添加else

答案 6 :(得分:0)

else {
System.out.println("You did not provide a valid option.");
}   
System.out.println(dots_per_page);

编码非常接近于工作。只有一个小错误。在if-else语句中,您打印出一条声明“您没有提供有效选项”。然后,打印出dots_per_page。但是,如果它已转到else语句,则无法打印dots_per_page。我建议在if-else语句的其他区域有一个print语句,你可以确定你有一个打印的dots_per_page

答案 7 :(得分:-1)

尝试将dots_per_page设为空?声明我的意思。