2015-09-28 4 views
0
package com.mypackage; 

import java.util.List; 
import java.util.Map; 

public class InitializationDemo {  

    public static void main(String[] args) { 

     List<String> a, b = null; 
     List<String> c = null, d = null; 
     Map<String, String> e, f = null; 
     Map<String, String> g = null, h = null; 

     if(c == null){ //line $38: Works no compilation error 
      // Do Something here 
     } 

     if(a == null) { //line #40: compilation error 
      // Do Something here    
     } 

     if(e == null) { //line #44: compilation error 
      // Do Something here    
     } 

     if(g == null) { //line #46 Works no compilation error 
      // Do Something here    
     } 
    } 
} 

Получить «Локальная переменная a может не быть инициализирована». ошибка компиляции в строке # 40 и строке # 44:Инициализация нескольких переменных Java - Как это работает?

Я пытаюсь понять под деревом, как это работает, так что строки # 38 и # 46 не сигнализируют ошибку компиляции, однако ошибка компиляции сигналов # 40 и # 44 ,

+2

Почему на земле вы бы написать код таким образом? Ужасно. Будем надеяться, что это плохо продуманный пример, а не то, что вы когда-либо писали. – duffymo

+1

Любой инициализатор, который вы предоставляете в сочетании с объявлением локальной переменной, применяется только к переменной, прямо слева от знака '='. Он не применяется ни к каким другим переменным, указанным в том же самом заявлении, до или после. –

+0

Правильно плохо отформатирован, но в качестве примера – Shivakumar

ответ

4

Вы не инициализируете a, и поэтому он жалуется, что он, возможно, не был инициализирован. Вы должны сделать:

List<String> a =null, b = null; 

вместо:

List<String> a, b = null; 

как позже один эквивалентно:

List<String> a; 
List<String> b = null; 
4
List<String> a, b = null; 

это эквивалентно

List<String> a; 
List<String> b = null; 

, что ответить на ваш вопрос?

+0

Ударьте меня на это. Это правильный ответ. –

+1

Хорошо. Объявляя таким образом Список a, b = null; почему кто-то ожидал, что переменной «b» будет присвоено значение null и переменная «a», только что объявленная (и позволяющая ей сигнализировать ошибку компиляции)? Не правда ли, чтобы обе переменные «a» и «b» присваивали null? С другой стороны, я думаю, что если это не правильный способ сделать множественную инициализацию переменных. Я бы предположил, что язык не поддерживает такую ​​инициализацию на первом месте (ее моя мысль, кстати!) – Shivakumar

+0

Когда я пишу код, это одно объявление переменной в строке. Я инициализирую ссылки в конструкторе, где они должны быть инициализированы. Вы не в порядке. – duffymo

1

Вы должны сделать a = null, b = null;. Инициализация переменных похожа на язык C, причем каждая переменная имеет собственное значение.

0

потому что вы должны инициализировать локальную переменную, локальные переменные не находятся на уровне объекта. он имеет только локальный охват. поэтому он не получает инициализацию при создании объекта. но в выполнении кода jvm ожидает значение для каждого поля. поэтому компилятор сообщает, что вы должны инициализировать локальную переменную.

1

Ваш код станет более читаемым и более простым в обращении, если вы выберете одну нотацию. Таким образом, либо объявить переменные, как:

List<String> a = null, b = null, c = null, d = null; 

или

List<String> a = null; 
List<String> b = null; 
List<String> c = null; 
List<String> d = null; 

Другой possiblitly, чтобы сделать это было бы:

List<String> a, b, c, d; 
a = b = c = d = null; 
Смежные вопросы