2014-12-26 3 views
0

В приведенном ниже примере:Как получить доступ к измененное значение статической переменной Java

class Foo { 
    public static String[] listofimages = new String[]{}; 

    public static void main(String[] args) { 

     for(int i = 1; i <= 3; i++) { 
        listofimages[i] = //some image that I am adding to it 
     } 

    } 
} 

Я пытаюсь получить доступ к недавно модифицирована listofimages переменной в другом классе, Foobar (см):

class Foobar(){ 
    public void someClass{ 
     Foo.listofimages //trying to access the newly modified listofimages variable with values in it 
} 

Вышеприведенный код не работает для меня. Я смущен тем, как обращаться к недавно измененным статическим переменным listofimages, в классе, который не объявлен в классе Foobar. Любая помощь будет очень признательна, спасибо! :)

+0

Обратите внимание, что объем статических переменных является класс, то есть до тех пор, как класс остается статический VARI ables остается. –

+0

Foobar - это отдельный класс. – Abhishek

ответ

3

Если вы инициализируете статический массив, как показано, то есть - listofimages = new String[]{}, это пустой массив, и listofimages[i] всегда будет генерировать исключение. Вы должны инициализировать его с положительной длиной и назначать только действительные индексы этого массива.

Что касается доступа к этому массиву из другого класса, то Foo.listofimages должен работать (хотя класс Foo должен быть общедоступным, чтобы быть видимым для классов, принадлежащих другим пакетам).

+0

Спасибо за ваши мысли! однако я попытался инициализировать его с положительной длиной и только присвоить значения действительным индексам, и проблема сохраняется. Похоже, что значение «Foo.listofimages», к которому обращаются в Foobar, является инициализированным значением без модификации или вообще не имеет значений в списках изображений – user3777343

+0

@ user3777343 Является ли код доступом к статическому массиву, работающему в том же потоке, что и код, который изменяет этот массив? – Eran

1

Когда вы ссылаетесь на класс в первый раз статически, все его статические переменные инициализируются. В этом случае ссылка на Foo влияет на инициализацию массива. Однако он пуст (как и в нулевой длине).

Даже если вы добавляете элементы в основной метод, он никогда не вызывается до того, как вы ссылаетесь на listofimages. Следовательно, он по-прежнему пуст и ссылается на индекс в массиве, который не содержит индекс, генерирует исключение.

Чтобы устранить эту проблему, вам нужно будет либо:

  • инициализировать массив определенного размера,
  • убедитесь main вызывается перед тем, как получить доступ к массиву,
  • инициализировать массив статически, включая все его элементы.

Однако, видя, что вы, кажется, новичок в Java, я хотел бы указать на некоторые причуды с вашим дизайном. Если у вас есть статическая переменная, вы выражаете, что переменная должна быть статичной, как при одинаковом уникальном значении для всех экземпляров вашего класса. По существу: для всех экземпляров Foolistofimages всегда должен иметь одинаковое содержимое, и все ссылки должны указывать на один и тот же экземпляр. Когда вы начинаете с Java, вряд ли вам понадобится эта конструкция. Могу ли я предложить вам просто объявить его общедоступным? Затем вы можете перенести инициализацию в конструктор Foo, и вы избежите проблемы, с которой вы сталкиваетесь.

1

Во время загрузки класса все статические переменные инициализируются ... в этом случае также инициализируется массив listofimages (хотя и пустой). Теперь при вызове метода someClass класса Foobar вы пытаетесь получить доступ к инициализирован, но пустой listofimages

Решение:

Либо убедитесь, что основной метод вызывается перед тем, как получить доступ к методу someClass так, что ваш массив может быть заселена или то, что вы можете сделать, это инициализировать массив как:

public static String[] listofimages = {"a","b"};

+0

@ user3777343 Пожалуйста, выберите ответ, если это поможет – Abhishek

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