2016-01-22 26 views
5

Affrontare un problema con un'app di esercitazione su cui sto lavorando. Sto affrontando un problema NullPointerException relativo al metodo toString. Essendo nuovo nello sviluppo di app Android, non sono sicuro della causa esatta anche dopo le mie ricerche su questo. Quindi chiedo qualcuno che abbia più familiarità con la traccia dello stack per aiutarmi gentilmente.Android: java.lang.NullPointerException: tentativo di richiamare il metodo virtuale 'java.lang.String java.lang.Object.toString()' su un oggetto nullo di riferimento

Nota: l'errore si verifica quando si fa clic sulla voce listview per accedere a una pagina di modifica per la voce del diario. Tuttavia non sembra affatto andare alla pagina di modifica.

Di seguito è riportato il mio codice attività in cui si verifica e la traccia dello stack.

Codice attività:

import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 

import android.content.Intent; 

import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 


public class ViewDiaryEntries extends AppCompatActivity { 

// Database Helper 
MyDBHandler db; 

// Listview 
ListView data_list; 

// Test var 
public final static String KEY_EXTRA_DATA_ID = "KEY_EXTRA_DATA_ID"; 

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

    db = new MyDBHandler(this); 

    // Displays the database items. 
    displayItems(); 
} 

// To display items in the listview. 
public void displayItems(){ 
    // To display items in a listview. 
    ArrayList db_data_list = db.getDiaryDBDataList(); 
    ArrayAdapter listAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, db_data_list); 

    // Set the adapter for the listview 
    data_list = (ListView) findViewById(R.id.dataListView); 
    data_list.setAdapter(listAdapter); 

    /* Experiment -------------------------------------------------------------*/ 

    data_list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      // Selected item store 
      String selectedEntry = ((TextView) view).getText().toString(); 

      // Test for regular expression 
      String[] listViewItemSplit = selectedEntry.split(" - "); 
      String listViewItempt1 = listViewItemSplit[0]; // For date and time 
      //String listViewItempt2 = listViewItemSplit[1]; // For save file name 

      //Toast.makeText(ViewDiaryEntries.this, listViewItempt1, Toast.LENGTH_LONG).show(); 

      if(listViewItempt1.equals("")){ 
       Toast.makeText(ViewDiaryEntries.this, "Error. Unable to detect entry ID.", Toast.LENGTH_LONG).show(); 
      } 
      else{ 
       // Pass on the data: 
       Intent editEntry = new Intent(ViewDiaryEntries.this, editdiaryentry.class); 
       editEntry.putExtra(KEY_EXTRA_DATA_ID, listViewItempt1); 
       startActivity(editEntry); 
      } 
     } 
    }); 
} 

// For the go back button. 
public void viewdiarytoinitialdiary_backbutt(View v){ 
    // Create and start new intent going back ot main page. 
    Intent main_page = new Intent(ViewDiaryEntries.this, User_Main_Menu_Options.class); 
    main_page.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(main_page); 
} 

// For the about button. 
public void viewdiarypage_directionabout_butt(View v){ 
    // Create an alert dialog 
    final AlertDialog.Builder about_page_dialog = new AlertDialog.Builder(ViewDiaryEntries.this); 
    about_page_dialog.setTitle("About This Page:"); 

    // Inputs values for the dialog message. 
    final String dialog_message = "This page will show you any saved diary entries you've.\n\n To edit an entry, do the following: \n\n- Take note of the Entry ID# (first value on entry display) \n- Type it in the number box at the bottom. \n- Press Edit Record icon next to number box, and wait for it to load."; 

    about_page_dialog.setMessage(dialog_message); 

    about_page_dialog.setPositiveButton("Got it!", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      // Closes the dialog. 
      dialog.cancel(); 
     } 
    }); 

    // Shows the dialog. 
    about_page_dialog.show(); 
} 

// Main menu button. 
public void viewDiaryEntriesMainMenushortcut_butt(View v){ 
    // Creates main menu alert dialog. 
    AlertDialog.Builder mainMenu_Dialog = new AlertDialog.Builder(this); 
    mainMenu_Dialog.setIcon(R.drawable.main_menu_symbol); 
    mainMenu_Dialog.setTitle("Main Menu"); 

    // Creates array adapter with items to fill the menu with. 
    final ArrayAdapter<String> menuItemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); 
    menuItemsAdapter.add("Home Screen"); 
    menuItemsAdapter.add("Diary"); 
    menuItemsAdapter.add("Tests"); 
    menuItemsAdapter.add("Activity"); 
    menuItemsAdapter.add("Media"); 
    menuItemsAdapter.add("Thought of the Day"); 
    menuItemsAdapter.add("Inspirational Quotes"); 
    menuItemsAdapter.add("Resources"); 
    menuItemsAdapter.add("Settings"); 

    // To close menu. 
    mainMenu_Dialog.setPositiveButton("Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
     } 
    }); 

    // To go to appropriate page upon selection. 
    mainMenu_Dialog.setAdapter(menuItemsAdapter, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      String selectedItem = menuItemsAdapter.getItem(which); 

      if(selectedItem.equals("Home Screen")){ 
       // Goes to main menu. 
       Intent mainMenu = new Intent(ViewDiaryEntries.this, User_Main_Menu_Options.class); 
       mainMenu.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(mainMenu); 
      } 
      else if(selectedItem.equals("Diary")){ 
       // Goes to diary page. 
       Intent diaryPage = new Intent(ViewDiaryEntries.this, ViewDiaryEntries.class); 
       diaryPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(diaryPage); 
      } 
      else if(selectedItem.equals("Tests")){ 
       // Goes to tests page. 
       Intent testsPage = new Intent(ViewDiaryEntries.this, TestChoices.class); 
       testsPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(testsPage); 
      } 
      else if(selectedItem.equals("Media")){ 
       // Goes to media page. 
       Intent mediaPage = new Intent(ViewDiaryEntries.this, initialMediaPage.class); 
       mediaPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(mediaPage); 
      } 
      else if(selectedItem.equals("Thought of the Day")){ 
       // Goes to thought of the day page. 
       Intent thoughtofthedayPage = new Intent(ViewDiaryEntries.this, thoughtQuotes.class); 
       thoughtofthedayPage.putExtra("quote_or_thought", 2); 
       thoughtofthedayPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(thoughtofthedayPage); 
      } 
      else if(selectedItem.equals("Inspirational Quotes")){ 
       // Goes to inspirational quotes page. 
       Intent inspirationalquotesPage = new Intent(ViewDiaryEntries.this, thoughtQuotes.class); 
       inspirationalquotesPage.putExtra("quote_or_thought", 1); 
       inspirationalquotesPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(inspirationalquotesPage); 
      } 
      else if(selectedItem.equals("Settings")){ 
       // Goes to settings page. 
       Intent settingsPage = new Intent(ViewDiaryEntries.this, settings.class); 
       settingsPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(settingsPage); 
      } 
     } 
    }); 

    mainMenu_Dialog.show(); 
} 

// For the settings button. 
public void viewdiarypagelisttoSettings_butt(View v){ 
    // Goes to settings page. 
    Intent settingsPage = new Intent(ViewDiaryEntries.this, settings.class); 
    settingsPage.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(settingsPage); 
} 

// For new entry. 
public void viewdiarypageaddEntry_butt(View v){ 
    // Opening up the diary add intent. 
    Intent newdiaryEntry = new Intent(ViewDiaryEntries.this, newdiaryentry.class); 
    startActivity(newdiaryEntry); 
} 
} 

Ecco la mia traccia dello stack che vedo:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference 
     at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:401) 
     at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369) 
     at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:194) 
     at android.widget.Spinner.onMeasure(Spinner.java:580) 
     at android.support.v7.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:407) 
     at android.view.View.measure(View.java:18794) 
     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715) 
     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461) 
     at android.view.View.measure(View.java:18794) 
     at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1283) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
     at android.widget.ScrollView.onMeasure(ScrollView.java:340) 
     at android.view.View.measure(View.java:18794) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
     at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:135) 
     at android.view.View.measure(View.java:18794) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) 
     at android.view.View.measure(View.java:18794) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
     at android.view.View.measure(View.java:18794) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:748) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:630) 
     at android.view.View.measure(View.java:18794) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) 
     at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643) 
     at android.view.View.measure(View.java:18794) 
     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100) 
     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:670) 
     at android.view.Choreographer.doFrame(Choreographer.java:606) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5417) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Qualsiasi aiuto verso una soluzione sarà apprezzato.

EDIT:

Così, dopo fissando avanti e indietro dal codice tra il database e l'attività interagisce con, sono riuscito a farlo funzionare di nuovo. Di seguito è quello che ho fatto nell'ordine esatto:

  1. Mi sono reso conto che avevo un campo data che non stava ricevendo dati, rettificato.
  2. Pulito il progetto.
  3. Android Studio riavviato (in pratica arrestando tutte le operazioni dell'ambiente di sviluppo).
  4. Disinstallato l'app dal mio telefono dev.
  5. Riavviato Android Studio e reinstallato l'app.
  6. In qualche modo funziona = _ =, sì è magico.

Sinceramente non ho idea di quale passo l'abbia effettivamente risolto. Suppongo che sia stato il campo della data nel database a rovinare le cose mentre non ricevevo dati.

+1

Una voce è 'null' in' db_data_list 'ArrayList –

+0

È che la tua intera st traccia di ack? Di solito c'è un blocco che inizia con qualcosa come "Causato da ...." – AutonomousApps

+0

@AutonomousApps, nient'altro a parte il PID dell'app. No causato da. Comunque penso che sia stato risolto. Aggiornerò il post originale per la situazione aggiornata. Grazie per la risposta. –

risposta

16

L'array nel ArrayAdapter contiene almeno una voce che è null. Non ci devono essere valori nulli lì.

La matrice è popolata in getDiaryDBDataList() quindi il problema è anche lì.

+0

Grazie per la risposta. Ero tornato al mio file java del gestore di database e ho capito il problema. Si prega di vedere il mio OP con la modifica in là. Funziona bene ora :) –

1

inizializzazione "db_data_list" in displayItems()

ArrayList db_data_list = new ArrayList(); 
+0

Grazie, l'ho fatto. Anche se non credo che faccia molta differenza, come afferma lo stesso Android Studio "ridondante". –

1

view come avete chiamato così qui sembra essere inizializzato e non legato a nulla

Textview someTextView = (TextView) data_list.findViewById(R.id.mytextview); 

^assumendo la TextView è dentro di la vista data_list, altrimenti scartare quel bit

Quindi, nel codice, si desidera aggiungere anche i controlli di lunghezza per

// Selected item store 
      String selectedEntry = someTextView.getText().toString(); 
      //Check length before trying to split anything 
      if (selectedEntry.length() > 0){ 
      // Test for regular expression 
      String[] listViewItemSplit = selectedEntry.split(" - "); 
      String listViewItempt1 = listViewItemSplit[0]; // For date and time 

E questo aiuterà a risolvere i problemi.

+0

Ottima idea, grazie per avermelo fatto notare. Lo farò per il codice. –

+0

Spero che funzioni per te! – childofthehorn

1

immagino invece di

String selectedEntry = someTextView.getText().toString(); 

bisogna usare

String selectedEntry = listAdapter.getItem(position); 

Poiché si utilizza oggetto adattatore di serie non è possibile ottenere selezionato dalla Mostra

Spero che questo vi aiuterà out

+0

Grazie per la risposta, ma ho già risolto il problema. I passaggi che ho preso sono nel post originale se ti interessano. Grazie ancora :). –

+0

thnxxxx funziona come un incantesimo –

Problemi correlati