3

这是一个无法编译的代码片段。我在最后一行收到一个错误,声称 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);
4

8 回答 8

6

您有一个dots_per_page从未获得价值的情况。如果print_typeis not 'T', 't', 'I', or 'i', then"You did not provide a valid option"被打印并且没有设置值。

如果你在第一行设置了一个默认值,这种情况下就会有默认值,一切正常。您还可以在最后一个else块中设置不同的值。

于 2013-09-19T22:55:47.950 回答
4

很多这些答案都在说您不能保留原始类型。这并不完全正确。您可以整天不设置原始类型,但在设置之前不能使用该变量。您dots_per_pagesystem.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);
于 2013-09-19T23:03:49.003 回答
3

Java 教程:原始数据类型

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

数据类型默认值

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

于 2013-09-19T23:00:00.160 回答
1

在开始时这样做:

long dots_per_page = 0;

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

else {
    dots_per_page = 0;
}

关键是:如果要读取一个值,则必须始终将其分配给局部变量,无论运行何种执行路径。只有属性有默认值。

于 2013-09-19T22:54:04.223 回答
1

如果print_type是 String,则需要用双引号括起来,并且需要使用“.equals()”方法进行比较。如前所述,如果它是一个字符,您的代码应该可以正常工作。

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

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

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

初始化你知道你的程序应该用一个它们不应该改变的值的变量,有助于显示你的程序是否正确运行。

于 2013-09-19T22:56:27.490 回答
0

dots_per_page 是原始类型,因此不允许取消设置。只需使用long dots_per_page =0; 或long dots_per_page = -1;一开始。

另一种选择是添加dots_per_page = 0;到您的else块中。

于 2013-09-19T22:57:51.723 回答
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 要打印

于 2015-11-09T06:32:15.493 回答
-1

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

于 2015-07-06T10:33:22.053 回答