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.

Community
  • 1
  • 1
pearmak
  • 4,979
  • 15
  • 64
  • 122

2 Answers2

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.

Vector
  • 41
  • 2
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

ρяσѕρєя K
  • 132,198
  • 53
  • 198
  • 213
  • 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!! – pearmak Nov 18 '12 at 13:00
  • currently where you are storing user selected values on button press? – ρяσѕρєя K Nov 18 '12 at 13:02
  • it is storing in Num_index (Activity 1) as String[] NUM_ALLL_QuestionNames. – pearmak Nov 18 '12 at 13:08
  • 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 – ρяσѕρєя K Nov 18 '12 at 13:08
  • if you have still any problem in solving this issue then plz post full code Num_index.class then i will edit for u – ρяσѕρєя K Nov 18 '12 at 13:13
  • I have tried several times...still unable to do so...i have updated the Activity 1 (Num_index) with full codes. Many many thanks for your kind help! – pearmak Nov 18 '12 at 13:49
  • @pearmak : declare `Bundle bundle = new Bundle();` globally means outside oncreate and change your current code as :`if ("your code here") { //your code here bundle.putStringArray("dataQ",NUM_ALLL_QuestionNames); bundle.putStringArray("dataA",NUM_ALLL_AnswerNames); //your code here } Intent intent = new Intent (Num_index.this, Num.class); intent.putExtras(bundle); startActivity(intent); Num_index.this.finish(); //your code here ` – ρяσѕρєя K Nov 18 '12 at 14:16
  • thanks again for your help. However, are there any modification needs for Activity 2 (Num.java)? This is because when executing, once pressing the start button, it then crashed. I have tested Activity 2 by adding a if else condition as above, if delete the if part and just executes the else part, the codes can be executed properly. However, if there is the if part, having black screen implies then bundle is not null, else if it is null it will go on the else part. Then that means there are something inappropriate for the bundle in Activity 2? – pearmak Nov 18 '12 at 15:08
  • posted the revised codes for Num.java as in the question. Thanks for your patience! – pearmak Nov 18 '12 at 15:15