2016-07-11 15 views
5

Wiemy, że zmienna lokalna musi zostać zainicjowana, aby mogła być użyta w konstrukcji if-else-if. Jako przykład poniższy kod nie zostanie skompilowany.Dlaczego zmienna lokalna jest inicjowana w konstruktach if-else, ale nie w konstrukcjach if-else-if?

public class Test { 
    public static void main (String...args){ 
     double price= 11; 
     String model ; 
     if (price>10) 
     {model ="smartphone";} 
     else if (price<=11) 
     {model="not smart phone";} 
     System.out.println(model); 
    } 
} 

Ale jeśli zmienisz else if (price<=11) do else lub zainicjować zmienną lokalną do pewnego modelu String losowej wartości, kod zostanie skompilowany pomyślnie. Moje pytanie w tym przypadku brzmi "dlaczego?"

Teraz, to było pytanie z książki i wyjaśnienie było.

„lokalny model zmienna jest zadeklarowana tylko nie zainicjowany Inicjalizacja zmiennej modelu jest umieszczony wewnątrz if i else-if Jeśli zainicjujesz zmienną wewnątrz konstruktu if lub else-if, kompilator nie może mieć pewności, czy warunki te zostaną ustawione na true, co spowoduje brak inicjalizacji zmiennej lokalnej. "

Nawet po wyjaśnienia, ja nadal nie rozumiem dwóch rzeczy,

  1. Nie jestem pewien, dlaczego zmienna modelu pomyli kompilator, ponieważ podwójna cena jest 11 niezależnie od tego, jaki model jest.
  2. W jaki sposób magicznie zainicjować zmienną lokalną, gdy umieścisz jeszcze na końcu?
+0

'Cena' jest zmienną i jako taka może mieć wartość" zmienna ". Tak więc w twoim kodzie nie ma gwarancji, że albo 'if' lub' else if' zostanie wprowadzone do –

+0

ostatniego warunku if może zawieść 11.5 i ponieważ nie ma innego modelu, który nie zostanie zainicjowany, –

+0

@Joop for 11,5, z pewnością spełniony jest pierwszy warunek. Jednak na NaN może się nie udać. –

Odpowiedz

11

model musi zostać zainicjowany przed oświadczeniem System.out.println(model);, aby kod mógł przejść składanie.

  1. Kompilator nie analizuje warunki if-else-if w celu ustalenia, czy jeden z nich będzie zawsze spełniony, więc nie może być pewny, że albo czy inaczej, jeśli bloków są zawsze wykonywane, a zatem nie można mieć pewności, że model zostanie zainicjowany przed instrukcją println.

  2. Podczas korzystania if-else konstrukt, albo jeśli albo blok byłby stracony, więc skoro oboje zainicjować model, jest ona gwarantowana być inicjowane przed stwierdzeniem println.

Powiązane problemy