2010-03-15 114 views
30

当我尝试编译此:变量可能尚未初始化错误

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 

在我看来,我的方法的顶部初始化它们。发生什么事了?

回答

53

声明他们,但你没有初始化他们。初始化它们被设置他们等于值:

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

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

+19

也许 “INT B = 0;”是“声明和初始化”。 – Arun 2010-03-15 17:05:10

+0

对于未来的访问者...当可能未初始化的变量是类成员时,另请参见[Java中的默认值和初始化](http://stackoverflow.com/q/19131336)。 – jww 2016-12-06 18:05:33

+0

有人可以解释这是如何可能的,因为原语不能有空值,它们的默认值是0,为什么它显示没有初始化错误? – 2017-10-21 00:33:10

0
int a = 0; 
int b = 0; 
2

您声明了它们,但没有用值初始化它们。加入这样的事情:

1

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

int a = 0; 
int b = 0; 

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

+0

是Java是相同的(我觉得) – David 2010-03-15 18:05:41

1

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

int a = 0; 
int b = 0; 
6

如果他们被声明为类那么他们将非常初始化为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”。这是因为在创建Clazz的新实例时会调用特殊的构造函数。起初super()将被调用,然后现场a将被隐式初始化,然后线b = 0将被执行。

3

您声明了它们,但未初始化。

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

您声明了它们,但没有为它们提供初始值 - 因此,它们是非空间化的。尝试类似:

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

并且警告应该消失。

1

想像一下,如果X [1]既不是0也不是在环路1会发生什么。在这种情况下,a和b将永远不会被赋值并且具有未定义的值。 必须使用某个值初始化他们两个,例如0

55

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

有一个很大的不同,当你在类级声明变量(作为部件即作为一个字段),并且在方法的水平。

如果您在类级声明一个字段,它们将根据它们的类型获取默认值。如果您在方法级别或块中声明变量(意味着{}内的任何代码)不会获取任何值并保持未定义状态,直到它们以某种方式获得一些开始值,即分配给它们的某些值。

1

设置变量 “a” 像这样一些价值,

a=0; 

声明和initialzing都是不同的。

好运

+0

不是。初始化是声明语法的一个可选部分。 – EJP 2018-01-28 03:20:32