2015-02-13 3 views
1

Я выполнил поиск, и, похоже, это зависит от того, что вызывает это. Хотя, кто-то, кто действительно это понимает, вполне может не согласиться.Android App Crash NullPointerException

Мои кнопки, идущие от моего главного экрана к другим действиям, работают нормально, единственное отличие от того, что не работает, это то, что он на самом деле вытягивает класс/переменную из другого .java-файла, и поэтому я уверен, что я не реализовали его правильно.

Это класс Singleton:

GLOBAL.JAVA

//Constructor 
// 
protected Global() { 
    getInstance(); 
} 


//Singleton Method 
// 
public static Global getInstance() { 
    if(instance == null) { 
     initialize(); 
     instance = new Global(); 
    } 
    return instance; 
} 

У меня есть несколько (статический) класса структур (я использую термин структуры, потому что программы, прежде всего, в C++, и мне это что они есть), которые помещаются внутри глобального файла/класса, наряду с этим массивом, который содержит все данные для программы static questionStruct[] questions = new questionStruct[TOTAL_QUESTIONS];

initialize(); функция вызывается из getInstance() (Singleton метод в) просто заполняет данные в массив questionStruct[].

У меня есть метод, чтобы вернуть строку

public static String getQ(int q){ 

    return questions[q].q; 
} 

В файле .java, который вызывается с нажатой кнопкой, я placeData(); просто чтобы проверить вещи, и в этой функции:

public void placeData() { 

    String testString = ("Testing Text: " + Global.getQ(3)); 

    TextView Q = (TextView) findViewById(R.id.testingText); 
    Q.setText(testString); 


} 

и, наконец ... надеюсь ... TextView, где он должен отображаться в файле XML:

<TextView 
     android:id="@+id/testingText" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 

И вот моя официальная ошибка. Я считаю, что это индикатор сбоя, что происходит только тогда, когда я нажимаю кнопку, чтобы инициализировать эту операцию.

java.lang.RuntimeException: Unable to start activity ComponentInfo{godwin.com.study/godwin.com.study.practice}: java.lang.NullPointerException: Attempt to read from field 'java.lang.String godwin.com.study.Global$questionStruct.q' on a null object reference 

Мысли ???

EDIT:

Классы (например, структуры в C++) внутри Global.Java

class answerStruct 
{ 
    String a; 
    boolean status; 
} 


//Structure for Questions 
// 
class questionStruct 
{ 
    String q; 

    answerStruct[] answer = new answerStruct[TOTAL_ANSWERS]; 

} 

"инициализация()" функции:

public static void initialize() { 

    questions[0].q = "Question # 1"; 
    questions[0].answer[0].a = "Q1A1"; 
    questions[0].answer[0].status = true; 
    questions[0].answer[1].a = "Q1A2"; 
    questions[0].answer[1].status = false; 

    ...And so on...Forever 
} 
+0

Где находится 'questionStruct'? – iRuth

+0

Что такое 'questions [q] .q;'? Я не думаю, что вам нужен последний .q, просто 'вопросы [q]'? Также могут помочь полные номера трасс и строк. –

+1

Понятно, что проблема в том, что когда вы вызываете 'getQ' для некоторого значения' q', 'questions [q]' is 'null'. Это указывает на проблему в методе 'initialize()', но невозможно сказать, как исправить это, если вы не разместите код для этого метода. –

ответ

2

При выделении массива объектов в Java:

static questionStruct[] questions = new questionStruct[TOTAL_QUESTIONS]; 

Вы выделяете только массив ссылок на объекты, вы фактически не выделяете сами объекты. Это похоже на то, что вы выделили массив указателей в C++, но они пока ничего не указывают.

В верхней части Initialize() функция, вы можете выделить все объекты questionStruct, а также ответы на каждый в вложенном цикл, как это:

for(int i = 0; i < TOTAL_QUESTIONS; i++) 
{ 
    questions[i] = new questionStruct(); 
    for(int j = 0; j < TOTAL_QUESTIONS; j++) 
     questions[i].answer[j] = new answerStruct(); 
} 

Затем вы можете пройти и инициализируйте все поля в структурах, как вы это делаете.

+0

Находясь на верном пути, я следую, но, как я его вижу, настройка будет повторяющейся. Конечно, я устал, как черт, и эта проблема заставляет меня перекреститься друг с другом, ха-ха. Но не объявление декларации 'static questionStruct [] questions = new questionStruct [TOTAL_QUESTIONS];' и «для циклов», которые вы предоставили, повторяются? Я понимаю ваши аргументы в пользу предложения циклов for. Это имеет смысл, даже в моем нынешнем состоянии. Но разве я не должен избавляться от первой декларации? Честно говоря, я уверен, что если бы я работал над этим завтра, это имело бы смысл, но сейчас ... не так много. – lilgodwin

+0

Нет, вам нужны обе декларации. Первый для распределения самого массива и распределения в цикле для распределения каждого объекта, который хранится в массиве. – samgak

+0

Я не могу отметить ваш ответ как ответ, но это определенно помогло. У меня на самом деле была проблема в другом месте, которая вызывала крах, но я также знаю, что я не реализовал одноэлементный класс. И, очевидно, я ошибся в объявлении массива. Итак, спасибо за ваш вклад, это действительно помогло. – lilgodwin