2016-01-22 10 views
5

Wobec problemu z aplikacją do ćwiczeń, nad którą pracuję. Mam do czynienia z problemem NullPointerException związanym z metodą toString. Będąc nowicjuszem w rozwoju aplikacji na Androida, nie jestem pewien dokładnej przyczyny nawet po moich badaniach. Dlatego proszę kogoś, kto jest bardziej zaznajomiony ze śladami stosu, aby mi pomóc.Android: java.lang.NullPointerException: Próba wywołania metody wirtualnej "java.lang.String java.lang.Object.toString()" na odwołanym obiekcie o wartości zerowej

Uwaga: Błąd występuje, gdy kliknę pozycję listy, aby uzyskać dostęp do strony edycji wpisu dziennika. Wygląda jednak na to, że w ogóle nie wchodzi na stronę edycji.

Poniżej znajduje się mój kod aktywności, na którym on się znajduje i ślad stosu.

kod aktywny:

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); 
} 
} 

Oto mój ślad stosu, że widzę:

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) 

Każda pomoc w dążeniu do rozwiązania zostaną docenione.

EDIT:

Więc po wpatrując się w tę iz powrotem z kodu pomiędzy bazą danych a to oddziałuje z działalności, udało mi się dostać to działa ponownie. Oto co zrobiłem w dokładnej kolejności:

  1. Uświadomiłem sobie, że mam pole daty, które nie otrzymało żadnych danych, poprawione.
  2. Oczyszczone projekt.
  3. Ponownie uruchomiono system Android Studio (w zasadzie zatrzymując wszystkie operacje w środowisku programistycznym).
  4. Odinstalowałem aplikację z mojego telefonu dev.
  5. Zrestartowano studio android i ponownie zainstalowano aplikację.
  6. Jakoś działa = _ =, tak, to jest magia.

Szczerze mówiąc, nie mam pojęcia, który krok faktycznie go rozwiązał. Zgaduję, że to pole daty w bazie danych było dla mnie kłopotliwe, podczas gdy nie otrzymywało żadnych danych.

+1

Niektóre pozycje są 'null' w' db_data_list 'ArrayList –

+0

Czy to twój cały st ack trace? Zwykle jest blok, który zaczyna się od czegoś w stylu "Spowodowane przez ..." – AutonomousApps

+0

@AutonomousApps, nic więcej poza PID aplikacji. Nie spowodowany przez. Myślę jednak, że zostało to rozwiązane. Zaktualizuję oryginalny post na aktualną sytuację. Dziękuję za odpowiedź. –

Odpowiedz

16

Tablica w twoim ArrayAdapter zawiera co najmniej jeden wpis, który jest null. Nie może być żadnych zer.

Tablica jest wypełniona w getDiaryDBDataList(), więc problem również istnieje.

+0

Dzięki za odpowiedź. Wróciłem do pliku java obsługi bazy danych i znalazłem tam problem. Proszę zobaczyć mój OP z edycją tam. Teraz działa dobrze :). –

1

Initialize "db_data_list" w displayItems()

ArrayList db_data_list = new ArrayList(); 
+0

Dzięki, zrobiłem to. Chociaż nie sądzę, że ma to duże znaczenie, ponieważ sam Android Studio mówi, że jest "zbędny". –

1

view jak masz tak nazwał ją tutaj wydaje się być niezainicjowany i nie związane z niczym

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

^zakładając TextView jest wewnątrz widok listy danych, w przeciwnym razie odrzuć ten bit

Następnie w swoim kodzie, będziesz chciał dodać także sprawdzenia długości dla

// 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 

A to pomoże w rozwiązywaniu problemów na drodze.

+0

Świetny pomysł, dzięki za poinformowanie mnie. Zrobię to dla kodu. –

+0

Mam nadzieję, że to działa dla Ciebie! – childofthehorn

1

Chyba zamiast

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

trzeba użyć

String selectedEntry = listAdapter.getItem(position); 

Ponieważ używasz adaptera array nie można się wybrany element z widokiem

nadzieję, że to pomoże out

+0

Dzięki za odpowiedź, ale już rozwiązałem problem. Kroki, które podjąłem, są w oryginalnym poście, jeśli cię to interesuje. Dzięki jeszcze raz :). –

+0

thnxxxx działa jak urok –

Powiązane problemy