2011-08-27 100 views
2

我正在做关于Ackermann函数的书练习。错误:变量可能未被初始化

虽然我有一个问题。如果我声明结果但不初始化,编译器会抱怨“变量结果可能未被初始化”。

int result; 

当我将它设置为默认为0时,它不会抱怨。

int result = 0; 

我认为,当一个声明类型为int的变量时,它自动默认为0。

下面是完整的代码:

public class Ackermann { 
    public static int ack(int m, int n) { 
    int result = 0; 
    //int result; 
    if (m == 0) 
     result = n + 1; 
    else if(m > 0 && n == 0) 
     result = ack(m-1, 1); 
    else if(m > 0 && n > 0) 
     result = ack(m-1, ack(m, n-1)); 
    return result; 
    } 

    public static void main(String[] args) { 
     System.out.println(ack(3, 3)); 
    } 

} 

回答

6

局部变量不使用默认值初始化。请参阅language specs了解实际情况。

3

不初始化变量是非常糟糕的做法。有一个流行的笑话适合你的情况:约翰从他的母亲得到3个苹果,从他父亲得到5个苹果。约翰有多少苹果?如果你不是很好的程序员,你的答案将是8.如果你是一位优秀的程序员,你会回答我们不知道苹果从他母亲那里得到苹果之前有多少苹果。请记住:始终初始化变量并且不要假设它们将为0.

+2

您似乎暗示未初始化的int变量可能具有非0值。这是错误的(无论如何Java)。未被显式初始化的成员变量将始终具有值0,并且不会初始化局部变量,只会导致OP注意到的编译错误。所以不初始化当地人是不错的做法 - 这是一个编译器错误。不初始化成员可能是不好的做法,但这纯粹是一个可读性问题,与可能不是0的变量无关。 – sepp2k

2

类中的字段默认为值(null,0,false等)。但是局部变量不会,您必须明确地定义它们。很多人甚至不同意不明确地设置字段,因为设置它会向读者表明您实际上已经考虑将其设置为一个值,而不是忘记设置它,因此可能会导致错误。