2010-03-15 137 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