Android: java.lang.NullPointerException: попытка вызвать виртуальный метод «java.lang.String java.lang.Object.toString ()» в ссылке на нулевой объект

Перед работой с практическим приложением я работаю. Я столкнулся с проблемой NullPointerException, связанной с методом toString. Будучи новичком в разработке приложений для Android, я не уверен в конкретной причине даже после моих исследований. Поэтому я прошу кого-то, кто более знаком со стеком стека, любезно помочь мне.

Примечание. Ошибка возникает, когда я нажимаю на запись listview для доступа к странице редактирования для записи дневника. Однако, похоже, он вообще не попадает на страницу редактирования.

Ниже вы найдете мой код активности, на котором это происходит, и трассировку стека.

Код мероприятия:

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

Вот моя трассировка стека, которую я вижу:

 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) 

Любая помощь в решении будет оценена по достоинству.

РЕДАКТИРОВАТЬ:

Поэтому, смотря взад и вперед по коду между базой данных и активностью, с которыми она взаимодействует, мне удалось заставить ее работать снова. Ниже приводится то, что я сделал в точном порядке:

  1. Я понял, что у меня есть поле даты, которое не получает никаких данных, исправлено это.
  2. Очистил проект.
  3. Перезагрузка Android Studio (в основном, остановка всех операций среды разработки).
  4. Удалено приложение из моего телефона.
  5. Перезагрузилась студия Android и снова установила приложение.
  6. Я как-то работает = _ =, да, это волшебство.

Честно говоря, я не знаю, какой шаг на самом деле решил. Я предполагаю, что поле даты в базе данных было бесполезным для меня, пока оно не получало никаких данных.

    Массив в вашем ArrayAdapter содержит хотя бы одну запись, которая является null . Там не должно быть никаких нулей.

    Массив заполнен в getDiaryDBDataList() поэтому проблема также существует.

    Инициализировать «db_data_list» в displayItems ()

     ArrayList db_data_list = new ArrayList(); 

    view как вы назвали его здесь, кажется, неинициализированы и не привязаны ни к чему

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

    ^ Предполагая, что текстовое представление находится внутри представления data_list, в противном случае отбросить этот бит

    Затем в вашем коде вы также захотите добавить проверки длины для

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

    И это поможет с проблемами в будущем.

    Я полагаю, вместо

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

    Вы должны использовать

     String selectedEntry = listAdapter.getItem(position); 

    Поскольку вы используете адаптер массива, вы не можете получить выбранный элемент из представления

    Надеюсь, это поможет вам