2013-05-18 15 views
5

Oto część małego programu robię jako zadanie domowe:Handling niezainicjowane ciągów w Javie

public Exam maxGrade() { 
    Node p = firstNode; 
    int max = 0; 
    String name; 
    while (p!=null) { 
     if (p.info.getGrade()>max) { 
      max = p.info.getGrade(); 
      name = p.info.getName(); 
     } 
     p = p.next; 
    } 

    if (name==null) 
     return null; 
    else 
     return searchByName(name); 
} 

Kiedy więc śmiało i kompilacji, wyjścia kompilatora tę wiadomość:

Student.java:127: error: variable name might not have been initialized if (name==null)

problem można łatwo rozwiązać poprzez zastąpienie czwartej linii z:

String name = null; 

Teraz widzę pewną logikę w to. Ale naprawdę chciałbym zrozumieć działania stojące za tym problemem. Mam na myśli, rozsądne, że kompilator sprawdza, czy zmienna jest zainicjowana, jeśli widzi, że robisz coś z tym w kodzie, ale nie sądzę, że robię cokolwiek, co POTRZEBUJE zmiennej, która ma zostać zainicjowana.

Według źródeł takich jak this po prostu zadeklaruję zmienną "String" zmiennej String (lub dowolnego innego obiektu), która już wskazuje na wartość null. Dlaczego jest to anomalia, aby sprawdzić, czy ta wartość jest zerowa? Czy kompilator uzna błąd za cokolwiek, co zrobię z niezainicjowaną zmienną inną niż przypisania?

+3

Nie, to * nie * to, co mówi (podany link). Jak stwierdzono w zaakceptowanej odpowiedzi, zmienne lokalne nie są inicjowane, stąd błąd. –

+0

Możliwy duplikat [Zmienna nie został zainicjalizowany błąd] (http://stackoverflow.com/questions/2448843/variable-might-not-have-been-initialized-error) wśród wielu innych. –

Odpowiedz

12

Pola typu obiektu są domyślnie inicjowane na wartość null. Elementy macierzy są również domyślnie inicjowane na wartość null.

Zmienne lokalne nie są - muszą być zainicjowane jawnie.

To dobrze. Niezainicjowane zmienne często wskazują na błąd.

Od "Initial Values of Variables" w rozdziale 4 języka Java Specification:

A local variable (§14.4, §14.14) must be explicitly given a value before it is used, by either initialization (§14.4) or assignment (§15.26), in a way that can be verified using the rules for definite assignment (§16).

+2

Należy również pamiętać, że wartość null może powodować pewne problemy z niektórymi funkcjami ciągów, jeśli nie jesteś ostrożny. Tak więc czasami robię zamiast tego 'String foo =" ". –

+0

Dziękuję bardzo! – user2397616

1

Kompilator wymaga inicjalizacji obiektu do null jeśli robisz żadnych założeń co do jego wartości. Jest to po prostu (bardzo przydatna) ostrożność.

+0

Należy zauważyć, że nie można zainicjować obiektu na wartość null, ale można zainicjować referencję typu obiektu na wartość null. –

0

Dodatek: Kompilator nie może sprawdzić semantyki programu. Nawet jeśli wiesz, że zmienna jest initilized przed pierwszym użyciem kompilator nie może.

rozważyć następującą funkcję:

public boolean mod2(int i){ 
    if(i % 2 == 0){ 
     return true; 
    } 
    if(i % 2 != 0){ 
     return false; 
    } 
} 

Wszyscy wiemy, że ta metoda zawsze zwraca wartość true lub false. Zamiast tego kompilator zapewnia, że ​​zawsze będzie zwracana wartość, ponieważ musi wiedzieć, że będą tylko te dwa wyniki. Tak więc kompilator zgłosi błąd dotyczący brakującej instrukcji return.