当我试图编译时:
public static Rand searchCount (int[] x)
{
int a ;
int b ;
...
for (int l= 0; l<x.length; l++)
{
if (x[l] == 0)
a++ ;
else if (x[l] == 1)
b++ ;
}
...
}
我得到这些错误:
Rand.java:72: variable a might not have been initialized
a++ ;
^
Rand.java:74: variable b might not have been initialized
b++ ;
^
2 errors
在我看来,我在方法的顶部初始化了它们。怎么了?
12条答案
按热度按时间30byixjq1#
如果它们被声明为类的字段,那么它们将被初始化为0。
你有点困惑,因为如果你写:
然后此代码将打印“0”。这是因为在创建clazz的新示例时会调用一个特殊的构造函数。起初
super ()
将被调用,然后字段a
将隐式初始化,然后b = 0
将被执行。yhqotfr82#
将变量“a”设置为如下值,
声明和初始化都是不同的。
祝你好运
sauutmhj3#
在使用方法块之前,初始化方法块中的局部变量是一种很好的做法。这是初学者可能犯的一个错误。
您可能希望控制台将显示“5”,但编译器将抛出“variable a may not be initialized”错误。尽管有人可能认为变量a在for循环中是“初始化的”,但编译器不会这样想。如果…怎么办
arr.length
是0吗?for循环根本不会运行。因此,编译器将给出variable a might not have been initialized
指出潜在的危险并要求您初始化变量。为了防止这种错误,只需在声明变量时初始化它。
vc6uscn94#
由于没有其他答案引用java语言标准,我决定自己写一个答案:
在java中,默认情况下,局部变量不是用某个值初始化的(例如,与类的字段不同)。从语言规范一(§4.12.5)可以阅读以下内容:
局部变量(§14.4, §14.14)必须在使用之前通过初始化或(§14.4)或转让(§15.26),以可使用明确分配规则验证的方式(§16(明确分配)。
因此,由于变量
a
以及b
未初始化:操作
a++;
以及b++;
无论如何,无法产生任何有意义的结果。因此,编译器通知您这一点是合乎逻辑的:然而,我们需要明白
a++;
以及b++;
无法生成任何有意义的结果与编译器显示错误的原因无关。而是因为它是在java语言规范上显式设置的局部变量(§14.4, §14.14)必须显式给定一个值(…)
为了展示上述观点,让我们将您的代码更改为:
因此,即使上面的代码可以被正式证明是有效的(即变量
a
以及b
将始终指定值0
以及1
编译器的工作不是试图分析应用程序的逻辑,局部变量初始化规则也不依赖于此。编译器检查变量a
以及b
根据局部变量初始化规则初始化,并作出相应React(例如,显示编译错误)。uurity8g5#
你还没有初始化
a
以及b
,只声明了它们。有一个微妙的区别。至少对于c++,我认为java是相同的概念。
nr9pn0ug6#
您声明了它们,但没有用值初始化它们。添加如下内容:
hjzp0vay7#
局部变量不获取默认值。它们的初始值是未定义的,没有通过某种方式赋值。在使用局部变量之前,必须对它们进行初始化。
当您在类级别(作为成员,即作为字段)和方法级别声明变量时,会有很大的区别。
如果在类级别声明字段,它们将根据类型获得默认值。如果在方法级或作为块(表示{}中的任何代码)声明变量,则不要获取任何值并保持未定义状态,直到它们以某种方式获取一些起始值(即分配给它们的一些值)。
ctehm74n8#
你声明了它们,但没有初始化它们。初始化它们就是将它们设置为一个值:
你得到错误是因为你没有初始化变量,但是你增加了它们(例如。,
a++
)在for
循环。java原语有默认值,但正如一位用户在下面评论的那样
当声明为类成员时,它们的默认值为零。局部变量没有默认值
jutyujz09#
您声明了它们,但没有初始化。
62lalag410#
您在方法开始时声明了它们,但从未初始化它们。初始化是将它们设置为一个值,例如:
wswtfjt711#
您声明了它们,但没有为它们提供初始值—因此,它们未初始化。尝试以下操作:
警告应该消失。
m0rkklqb12#
想象一下如果x[l]在循环中既不是0也不是1会发生什么。在这种情况下,a和b将永远不会被赋值,并且具有未定义的值。必须用某个值初始化它们,例如0。