0

I am making a quiz where the question and answer lists are needed to pass from activity 1 to activity 2. Relevant Codings extracted as follows:

Activity 1: Num_index.java

   String[] NUM_ALLL_QuestionNames; 
   String[] NUM_ALLL_AnswerNames;   

   @Override
   public void onCreate(Bundle savedInstanceState) 
   {
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main_num_index); 

      Button ButtonStart= (Button) findViewById(R.id.buttonStart);
      ButtonStart.setOnClickListener(startButtonListener);

      Button ButtonBackkk= (Button) findViewById(R.id.buttonBackkk);

      CheckTextView = (TextView) findViewById(R.id.checktextView); 

      NUM_SIM_QuestionNames = getResources().getStringArray(R.array.Num_Q_Simple_List);
      NUM_MED_QuestionNames = getResources().getStringArray(R.array.Num_Q_Medium_List);
      NUM_DIF_QuestionNames = getResources().getStringArray(R.array.Num_Q_Diff_List);
      NUM_EXP_QuestionNames = getResources().getStringArray(R.array.Num_Q_Expert_List);

      NUM_SIM_AnswerNames = getResources().getStringArray(R.array.Num_A_Simple_List);
      NUM_MED_AnswerNames = getResources().getStringArray(R.array.Num_A_Medium_List);
      NUM_DIF_AnswerNames = getResources().getStringArray(R.array.Num_A_Diff_List);
      NUM_EXP_AnswerNames = getResources().getStringArray(R.array.Num_A_Expert_List);

      NUM_ALL_QuestionNames = new ArrayList<String>();
      NUM_ALL_AnswerNames = new ArrayList<String>();                              
   };

   private OnClickListener startButtonListener = new OnClickListener() 
   {
      @Override
      public void onClick(View v) 
      {
          CheckBox CheckSim = (CheckBox) findViewById(R.id.checkBox2);
          // other similar checkBox omitted here for simplicity // 

          NUM_ALL_QuestionNames.clear();
          NUM_ALL_AnswerNames.clear();  

          if (CheckSim.isChecked()) 
          {
              QuestionImport= 0;                  
              QuestionImport = NUM_SIM_QuestionNames.length;
              int i =0;
              while (i<QuestionImport)
              {
                  String Q_toimport = NUM_SIM_QuestionNames[i];
                  String A_toimport = NUM_SIM_AnswerNames[i];   

                  NUM_ALL_QuestionNames.add(Q_toimport);
                  NUM_ALL_AnswerNames.add(A_toimport);                    
                  ++i;                    
              }           
          };    

         // other similar checkBox omitted here for simplicity // 

          if ((!CheckSim.isChecked()) && (!CheckMed.isChecked()) && (!CheckDif.isChecked()) && (!CheckExp.isChecked()))  
          {
              int k = 0;
              if (NUM_ALL_QuestionNames.size() >0) {k= NUM_ALL_QuestionNames.size();}
              CheckTextView.setText(String.valueOf(k));

                AlertDialog.Builder builder = new AlertDialog.Builder(Num_index.this);
                builder.setTitle("Error");
                builder.setMessage("Please select at least one choice!!");
                builder.setCancelable(false);
                builder.setPositiveButton("OK", null);                 
                AlertDialog ErrorDialog = builder.create();
                ErrorDialog.show();                   
          }

          if ((CheckSim.isChecked()) || (CheckMed.isChecked()) || (CheckDif.isChecked()) || (CheckExp.isChecked()))  
          {
              NUM_ALLL_QuestionNames = new String[NUM_ALL_QuestionNames.size()]; //convert ArrayList<String> to String[]
              NUM_ALLL_AnswerNames = new String[NUM_ALL_AnswerNames.size()]; //convert ArrayList<String> to String[]

              Intent senddata = new Intent (Num_index.this, Num.class); //transmit the list to num.java
              Bundle bundle = new Bundle();
              bundle.putStringArray("dataQ",NUM_ALLL_QuestionNames);
              bundle.putStringArray("dataA",NUM_ALLL_AnswerNames);
              senddata.putExtras(bundle);
              startActivity(senddata);                            

              int k = 0;
              if (NUM_ALLL_QuestionNames.length >0) {k= NUM_ALLL_QuestionNames.length;}
              CheckTextView.setText(String.valueOf(k));                                   
          }           

           Intent intent = new Intent (Num_index.this, Num.class);
           startActivity(intent);
           Num_index.this.finish();               

      } // end method onClick
   }; // end OnClickListener    

Activity 2: Num.java

   private String[] NUM_ALL_QuestionNames;
   private String[] NUM_ALL_AnswerNames;

   @Override
   public void onCreate(Bundle savedInstanceState) 
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main_num); 

      //get bundle from Num_index.java
      Bundle bundle = this.getIntent().getExtras();
      if (bundle!= null)
      {
          NUM_ALL_QuestionNames = bundle.getStringArray("dataQ");
          NUM_ALL_AnswerNames = bundle.getStringArray("dataA");          
      }
      else
      {
          NUM_ALL_QuestionNames = getResources().getStringArray(R.array.Num_Q_Simple_List);
          NUM_ALL_AnswerNames = getResources().getStringArray(R.array.Num_A_Simple_List);             
      }

Logcat:

11-18 20:26:20.905: E/AndroidRuntime(5463): FATAL EXCEPTION: main
11-18 20:26:20.905: E/AndroidRuntime(5463): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pearappx.iq_3/com.pearappx.iq_3.Num}: java.lang.NullPointerException
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.ActivityThread.access$600(ActivityThread.java:127)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.os.Looper.loop(Looper.java:137)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.ActivityThread.main(ActivityThread.java:4511)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at java.lang.reflect.Method.invokeNative(Native Method)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at java.lang.reflect.Method.invoke(Method.java:511)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at dalvik.system.NativeStart.main(Native Method)
11-18 20:26:20.905: E/AndroidRuntime(5463): Caused by: java.lang.NullPointerException
11-18 20:26:20.905: E/AndroidRuntime(5463):     at com.pearappx.iq_3.Num.onCreate(Num.java:73)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.Activity.performCreate(Activity.java:4470)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
11-18 20:26:20.905: E/AndroidRuntime(5463):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1931)

Line 73 is

NUM_ALL_QuestionNames = bundle.getStringArray("dataQ"); 

which means the StringArray is not properly stored in Activity1 or cannot properly fetched in Activity2. It shows NullPointerException.

Question:

I have searched through this website like String back from Bundle , and How to pass the selectedListItem's object to another activity? and follow the method described but still fails. But why it is NullPointerException? How can this be tackled?

Many thanks!!

PS: In Activity 1 I have

              if (NUM_ALLL_QuestionNames.length >0) {k= NUM_ALLL_QuestionNames.length;}
              CheckTextView.setText(String.valueOf(k)); 

and k gives out a correct number of items. This means NUM_ALLL_QuestionNames is not blank.

2 Answers 2

4

http://developer.android.com/guide/components/activities.html#StartingAnActivity

You should send your bundle of data with your second intent. And remove the first intent completely.

Sign up to request clarification or add additional context in comments.

Comments

2

As in your Current Code You are starting Num.class Activity two Times first using startActivity(senddata); and second time startActivity(intent); which contains no bundle object that's why you are getting NullPointerException

9 Comments

thanks!! I understand your meaning. The above codes are inside a OnClickListener such that when the user presses the button, the final Question and Answer lists would be stored (as the user can choose any of the types of questions and so the file is variable). At the same time, once the button is pressed, it will initiate to the Num.java activity. How could this be modified such that when pressing the button can do both actions? (sorry for sounding stupid to ask, but I am still learning to write Intent part). Many thanks!!
currently where you are storing user selected values on button press?
it is storing in Num_index (Activity 1) as String[] NUM_ALLL_QuestionNames.
just do every think like to save user selected values or prepare intent with values selected by user before to call startActivity(senddata); on button click
if you have still any problem in solving this issue then plz post full code Num_index.class then i will edit for u
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.