2016-11-16 4 views
-2

Я делаю программу викторины для android и поддерживаю совместимость для разных языков, я поставил все свои вопросы и метки для викторины в файле strings.xml. В основном функциональность, которую я ищу, - это отображать первый вопрос в TextView, а затем, когда пользователь отправляет свой ответ, он обновляется до следующего вопроса.Исключение Null Pointer при вызове getResources()

Вот мой код вместе с сообщением об ошибке, которое я получаю.

--------- beginning of crash 
11-16 10:37:21.723 26952-26952/com.example.neil.bsgquiz E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.neil.bsgquiz, PID: 26952 
                      java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.neil.bsgquiz/com.example.neil.bsgquiz.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2337) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490) 
                       at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:148) 
                       at android.app.ActivityThread.main(ActivityThread.java:5443) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
                      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference 
                       at android.content.ContextWrapper.getResources(ContextWrapper.java:87) 
                       at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:81) 
                       at android.support.v7.app.AppCompatActivity.getResources(AppCompatActivity.java:551) 
                       at com.example.neil.bsgquiz.MainActivity.<init>(MainActivity.java:28) 
                       at java.lang.Class.newInstance(Native Method) 
                       at android.app.Instrumentation.newActivity(Instrumentation.java:1090) 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2490)  
                       at android.app.ActivityThread.-wrap11(ActivityThread.java)  
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1354)  
                       at android.os.Handler.dispatchMessage(Handler.java:102)  
                       at android.os.Looper.loop(Looper.java:148)  
                       at android.app.ActivityThread.main(ActivityThread.java:5443)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)  




package com.example.neil.bsgquiz; 

import android.content.res.Resources; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

import org.w3c.dom.Text; 

import static android.icu.lang.UCharacter.GraphemeClusterBreak.T; 

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    int correctAnswers = 0; 
    int questionCounter = 0; 

    //TODO Bug seems to be in this section, about getting resources. 

    //get question header array from resources 
    Resources res = getResources(); 
    String[] questionHeaders = res.getStringArray(R.array.question_header_array); 

    //get answer key array from resources 
    String[] answerKey = res.getStringArray(R.array.answer_key_array); 

    //get questions from resources 
    String[] questions = res.getStringArray(R.array.questions_array); 


    public void submitAnswer() { 
     //create Edit Text object, and extract user input answer from it 
     EditText userAnswerEditText = (EditText) findViewById(R.id.answer_text); 
     String userAnswer = userAnswerEditText.getText().toString(); 

     //compare against answer key and tell user if right or wrong 
     if (userAnswer.compareToIgnoreCase(answerKey[questionCounter]) == 0) { 
      Toast.makeText(this, "That's Correct!", Toast.LENGTH_SHORT).show(); 
      correctAnswers++; 
     } else { 
      Toast.makeText(this, "Sorry, That's Incorrect", Toast.LENGTH_SHORT).show(); 
     } 
     nextQuestion(); 
    } 

    /** 
    * @param questionNumber: what question are we getting a hint for 
    * @return String containing a hint to give to the user 
    */ 
    private String getHint(int questionNumber) { 
     return "0"; 
    } 

    private void nextQuestion() { 
     //step forward question header 
     TextView headerText = (TextView) findViewById(R.id.question_header); 
     headerText.setText(questionHeaders[questionCounter]); 

     //step forward question text 
     TextView questionText = (TextView) findViewById(R.id.question_text_view); 
     questionText.setText(questions[questionCounter]); 

     //reset hint for EditText 
     EditText userAnswerEditText = (EditText) findViewById(R.id.answer_text); 
     userAnswerEditText.setHint("Answer"); 

     //update correct answer counter 
     TextView correctAnswers = (TextView) findViewById(R.id.correct_answer_counter); 
     correctAnswers.setText(correctAnswers + "/8"); 

     questionCounter++; 
    } 
} 

ответ

7

Вы получаете доступ к ресурсам слишком рано, в MainActivity.<init>, например. инициализация поля. Вы можете использовать свою деятельность только как Context с Resources в onCreate() или позже в жизненном цикле деятельности.

Переведите getResources() и getStringArray() на номера onCreate().

+0

Так что, если я понимаю, это правильно, я должен двигаться «Ресурсы Рез = res.getStringArray) в метод OnCreate()? –

+0

Как только я переместили их в 'onCreate', массивы больше не доступны для остальной части класса.Как затем я делаю эти массивы доступными из любого места в классе? Извините за вопросы noob, это одно из моих первых приложений для Android, и первый раз, когда я использовал ресурсы таким образом. –

+1

@NeilRuggiero: «Как только я переместил их в onCreate, массивы больше не доступны для остальной части класса» - оставьте поля, в которых у. Переместите ** инициализаторы ** в 'onCreate()', после 'super.onCreate()'. Так, например, у вас есть 'Resources res;' как поле и 'res = getResources()' в 'onCreate()'. – CommonsWare

0

Для тех, кто заинтересован, я получил свой код и выполнил следующее.

public class MainActivity extends AppCompatActivity { 

    String[] questionHeaders, answerKey, questions; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Resources res = getResources(); 
     questionHeaders = res.getStringArray(R.array.question_header_array); 
     answerKey = res.getStringArray(R.array.answer_key_array); 
     questions = res.getStringArray(R.array.questions_array); 
    } 

    int correctAnswers = 0; 
    int questionCounter = 0; 
  1. Заявленный три String [] массивы в основной деятельности до onCreate().
  2. Инициализировать объект «Ресурсы» с именем res внутри onCreate().
  3. Вызов getStringArray на res, чтобы загрузить каждый String [] массив
Смежные вопросы