2013-05-31 4 views
3
public class Test { 
    public static void main(String... args) { 

     int[][] arrayOfInts = { 
      {23, 3, 65, 46}, 
      {65, 55, 2, 3}, 
      {55, 22, 35, 47} 
     }; 
     int i, j, toFind = 2; 

     boolean foundIt = false; 

     search: 
     for(i = 0; i < arrayOfInts.length; i++) { 
      for(j = 0; j < arrayOfInts[i].length; j++) { 
       if(arrayOfInts[i][j] == toFind) { 
        foundIt = true; 
        break search; 
       } 
      } 
     } 

     if(foundIt) 
      System.out.println("Element found at index " + i + ", " + j); 
     else 
      System.out.println("Element not found"); 
    } 
} 

Дорогой СО, У меня возникли проблемы с составлением вышеуказанного кода. Мой код отлично работает, когда я инициализирую свою целочисленную переменную j до 0 (j = 0).Ошибка в моем простом java-коде ..!

Но мой вопрос Why should i initialize j = 0 ? Почему я получаю variable j might not have been initialized ошибку в строке

System.out.println("Element found at index " + i + ", "+ J);

Если моя ИНТ переменная i хранит значение, почему косяк j магазин .. ??

P.S. Noob здесь .. !!

+1

Чтобы расширить другие ответы, arrayOfInts.length вычисляется во время выполнения, а не во время компиляции. В этом очень простом случае компилятор мог бы, вероятно, определить, что arrayOfInts.length не может быть нулевым (мы можем видеть, что он не равен нулю, просто прочитав код), но в более общем случае он не может. Следовательно, компилятор предполагает, что внутренний цикл цикла никогда не будет выполнен. – jarmod

ответ

1

Пусть ваша внешний цикл for(i = 0; i < arrayOfInts.length; i++) { никогда не получить шанс выполняет для некоторого экземпляра исполнения (как первый раз i < arrayOfInts.length лжи, когда длина массива = 0), то j останется неинициализированного. И если значение foundIt истинно, для j нет значения для печати, если ошибка блока, следовательно, ошибка.

2

Потому что представьте себе, если у вас есть arrayOfInts.length==0?

Тогда вы никогда не войти в петлю -> J не инициализирован.

Чтобы доказать свою точку зрения, попробуйте скомпилировать и работает с

int[][] arrayOfInts = {}; 
+0

, попробуйте 'int i = 0, j = 0, toFind = 2;' или, еще лучше, используйте для этого 3 строки. – vikingsteve

+0

@vikingsteve как исправление для его кода да. – TecHunter

1

С arrayOfInts.lengthможет быть 0, ваш цикл не может быть выполнен ни разу. В этом случае вашей переменной j никогда не будет присвоено значение.

2

Причина заключается в том, что, насколько компилятор обеспокоен, arrayOfInts.lengthможет быть0 во время выполнения. Если это произошло, ваш цикл цикла никогда не запустится - поэтому j никогда не был бы инициализирован во внутреннем цикле.

1

Для того чтобы проверить, что вы действительно положили что-то в j, необходимо использовать его в своем заявлении println.

K, например, не будет инициализироваться, если arrayOfInts был размером 0.

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

1

Потому что это не то, что ваш внутренний цикл, который инициализирует j, будет выполняться. Имейте в виду, что выполнение цикла является условным, поэтому условия на вашем внешнем цикле (один с i) могут быть неверными. В этом случае строка, инициализирующая j, никогда не будет выполняться.

1

В java каждая локальная переменная должна быть инициализирована.

В первой строке цикла for переменная i получает инициализацию до 0. Но компилятор не уверен, что второй цикл будет иметь шанс выполнить.Предположим, что

arrayOfInts.length is 0. 

В этом случае значение j не будет инициализировано.

Приятно было проверить его, изменив if (foundIt) на if (false), компилятор перестанет жаловаться.

EDIT Все, о компиляторе никогда не предполагают. Он работает с имеющимися фактами, и там говорится следующее: 1) У меня всегда будет значение. 2 j может не получить значение и оставаться неинициализированным. 3) foundIt может быть правдой. :)

Кроме того, это действительно хорошая практика для инициализации переменных перед их использованием.

Переменные уровня класса автоматически инициализируются значениями по умолчанию во время инициализации класса. Но локальные переменные метода не являются, следовательно, ошибка времени жалобы/компиляции.

Смежные вопросы