2016-11-16 12 views
-2

私はアンドロイド用のクイズプログラムを作成しており、さまざまな言語で互換性を保つために、すべてのクイズの質問とラベルをstrings.xmlファイルに入れました。基本的に私が探している機能は、最初の質問がTextViewに表示され、ユーザーが回答を提出すると、次の質問に更新されます。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>などです。フィールドの初期化。アクティビティのライフサイクルでは、ContextResourcesonCreate()以降のアクティビティのみを使用できます。

getResources()getStringArray()の呼び出しをonCreate()に移動します。

+0

各文字列をロードするres上のコールgetStringArrayだから、私はのonCreate()メソッドに「リソースRES = res.getStringArray)を移動する必要がありますか? –

+0

私がしたらそれらを 'onCreate'に移動すると、配列は他のクラスからアクセスできなくなりました。どのようにすればクラス内のどこからでもこれらの配列にアクセスできますか? これは私の最初のアンドロイドアプリです。この方法で初めてリソースを使用したとき –

+1

@NeilRuggiero:「一度onCreateに移動すると、残りのクラスは配列にアクセスできなくなりました」 - そうです。 'super.onCreate()'の後に、**初期化子**を 'onCreate()'に移動します。たとえば、フィールドとして 'リソースres;'を、 'onCreate()'に 'res = getResources()'を持っています。 – 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. onCreate()前に主な活動に3つの文字列[]アレイを宣言しました。
  2. の中にresという名前の 'Resources'オブジェクトを初期化します。
  3. 私はこれを正しく理解していれば[]配列
関連する問題