variables可能没有被初始化错误

当我尝试编译这个:

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 

在我看来,我初始化他们在方法的顶部。 怎么了?

宣布他们,但你没有初始化他们。 初始化它们是将它们设置为一个值:

 int a; // This is a declaration a = 0; // This is an initialization int b = 1; // This is a declaration and initialization 

你得到的错误,因为你没有初始化的variables,但你增加它们(例如, a++ )在循环。

局部variables不会得到默认值。 他们的初始值是未定义的,通过某种方式分配值。 在你可以使用局部variables之前,它们必须被初始化。

当你在类层次(作为一个成员,即作为一个字段)和方法级别声明一个variables时,会有很大的不同。

如果您在课程级别声明了一个字段,则会根据其types获取默认值。 如果在方法级别或块中声明一个variables(意味着{}中的任何代码)不会获取任何值,并且保持未定义状态,直到某种方式获得一些起始值,即分配给它们的一些值。

如果它们被声明为类的字段,那么它们将被初始化为0。

你有点困惑,因为如果你写:

 class Clazz { int a; int b; Clazz () { super (); b = 0; } public void printA () { sout (a + b); } public static void main (String[] args) { new Clazz ().printA (); } } 

然后这个代码将打印“0”。 这是因为创buildClazz的新实例时会调用一个特殊的构造函数。 首先调用super () ,那么field a将被隐式初始化,然后行b = 0将被执行。

你宣布他们,但没有初始化。

 int a; // declaration, unknown value a = 0; // initialization int a = 0; // declaration with initialization 

你宣布他们,但没有初始化他们的价值。 添加这样的东西:

 int a = 0; 

你还没有初始化ab ,只声明它们。 有一个微妙的区别。

 int a = 0; int b = 0; 

至less这是C ++,我认为Java是相同的概念。

您在方法开始时声明了它们,但是您从未初始化它们。 初始化将设置它们等于一个值,例如:

 int a = 0; int b = 0; 

你宣布他们,但没有给他们一个初始价值 – 因此,他们是无形的。 尝试像这样:

 public static Rand searchCount (int[] x) { int a = 0 ; int b = 0 ; 

警告应该消失。

想象一下,如果循环中x [l]既不是0也不是1,会发生什么情况。 在这种情况下,a和b将永远不会被赋值并且具有未定义的值。 你必须用一些值来初始化它们,例如0。

将variables“a”设置为这样的值,

 a=0; 

声明和初始化都是不同的。

祝你好运

 int a = 0; int b = 0;