2012-03-01 3 views
2

Я вроде как новый для программирования, поэтому я уверен, что это простой ответ.Вызов строки [] из другого класса выглядит нулевым

В принципе, на мой основной метод, который я хочу сделать это:

...

wordtime = new LabelField("" + DataStored.words[0]);

...

Теперь в классе DataStored у меня есть: .. .

public static String[] words; 
{ 
    words = new String[2]; 

    words[0] = "Oil sucks!"; 
    words[1] = "Do you know that I can talk?"; 
} 

...

Так что каждый раз, когда я пытаюсь скомпилировать программу, ее останавливают в главном классе, говоря, что DataStored.words [0] имеет значение NULL. Как я могу заставить его заполнить поля из другого класса? Заранее спасибо!

ответ

4

Вы инициализация words в не- статический блок инициализации в DataStored. Это означает, что words не будет инициализирован до тех пор, пока вы на самом деле не создадите конструкцию экземпляр DataStored, который, вероятно, не является тем, что вы хотите.

Вам нужно сделать блок инициализации статический, как это:

public static String[] words; 
static { // <--------------------- 
    words = new String[2]; 

    words[0] = "Oil sucks!"; 
    words[1] = "Do you know that I can talk?"; 
} 

Это заставит блок будет работать, когда DataStored класс загружен.

6

Вы написали блок инициализатор там - он будет выполняться каждый раз, когда вы создаете новый экземпляр DataStored, но не до того времени. Я подозреваю, что вы хотите:

public static String[] words = { "Oil sucks!", "Do you know that I can talk?" }; 

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

(я сомневаюсь, что это не удаешься в компиляция времени, хотя - что это исполнения времени провала Это стоит быть ясно, о разнице.).

1

Если вы хотите инициализировать words правильно, вам нужно сделать это в статическом блоке , который запускается, как только класс загружается. Блок инициализации , который вы использовали, запускается только при создании экземпляра класса непосредственно перед вызовом конструктора. Поэтому, когда вы вызываете DataStored.words[0], инициализатор не запускается, а words по-прежнему равен нулю.

public static String[] words; 

static 
{ 
    words = new String[2]; 

    words[0] = "Oil sucks!"; 
    words[1] = "Do you know that I can talk?"; 
} 

Или вы можете просто сделать:

public static String[] words = new String[]{"Oil sucks!","Do you know that I can talk?"}; 

Или еще короче:

public static String[] words = {"Oil sucks!","Do you know that I can talk?"}; 
1

Если определить статический блок инициализации этих двух переменных в классе DataStored. Вы можете получить к нему доступ.

Класс DataStored {

общественности статической String [] слова;

Статический {

words[0] = "Oil sucks!"; 
words[1] = "Do you know that I can talk?"; 

}

}

-1

общественности статической String [] слова; { words = new String [2];

words[0] = "Oil sucks!"; 
words[1] = "Do you know that I can talk?"; } 

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

+0

-1. Ваш код в точности эквивалентен коду в вопросе, просто с некоторыми изменениями пробелов. –

+0

Я только цитировал его код. Не меняйте его. Я заявил об изменениях, которые ему нужны в моем комментарии. – Avogadro

+0

'public static String [] words() {words = new String [2]; слова [0] = "масло отстой!"; слов [1] = «Знаете ли вы, что я могу говорить?»; } ' – Avogadro