[英]Java instance variable initialization inside and outside constructor confusion
[英]Confusion with variable initialization
这是一个无法编译的代码片段。 我在最后一行收到错误,声称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);
你有一个dots_per_page
永远不会获得值的情况。 如果print_type
不是'T'
, 't'
, 'I'
或'i'
,则打印"You did not provide a valid option"
并且未设置该值。
如果在第一行中设置默认值,则此情况将具有默认值,并且一切正常。 您还可以在最后一个else
块中设置不同的值。
很多这些答案都说你不能保留原始类型。 这并非完全正确。 您可以整天保留原始类型,但在设置之前不能使用该变量。 您正在使用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);
声明字段时并不总是需要分配值。 声明但未初始化的字段将由编译器设置为合理的默认值。 一般来说,此默认值将为零或null,具体取决于数据类型。 然而,依赖于这样的默认值通常被认为是糟糕的编程风格。
局部变量略有不同; 编译器永远不会为未初始化的局部变量分配默认值。 如果无法初始化声明它的局部变量,请确保在尝试使用它之前为其赋值。 访问未初始化的局部变量将导致编译时错误。
在开始时这样做:
long dots_per_page = 0;
必须在Java中显式初始化所有局部变量,编译器抱怨,因为有一个执行路径没有为变量赋值:如果else
条件成立,则dots_per_page
的值是dots_per_page
? 或者,您可以将其添加到else
块:
else {
dots_per_page = 0;
}
重点是:无论运行什么执行路径,如果要读取本地变量,则必须始终为其赋值。 只有属性具有默认值。
如果print_type是String,则需要使用双引号,并且需要使用“.equals()”方法来比较它们。 如上所述,如果它是一个char,你的代码应该正常工作。
此外,如果结果不是“I”或“T”(或它们的小写版本),则dots_per_page在程序结束时没有值。
else {
System.out.println("You did not provide a valid option.");
dots_per_page = -1;
};
这样的事情(不可能的回报)会告诉你出了什么问题。
初始化变量,您知道您的程序应该更改为不应该的值,有助于显示您的程序是否正常运行。
dots_per_page是原始类型 ,因此不允许取消设置。 只需使用long dots_per_page =0
; 或者long dots_per_page = -1;
在开始。
另一种选择是添加dots_per_page = 0;
在你的else
块中。
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来打印
尝试将dots_per_page
设置为null? 声明我的意思是。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.