web-dev-qa-db-fra.com

Android: Java.lang.NullPointerException: tentative d'appeler la méthode virtuelle 'Java.lang.String Java.lang.Object.toString ()' sur une référence d'objet null

Faire face à un problème avec une application de pratique sur laquelle je travaille. Je suis confronté à un problème NullPointerException lié à la méthode toString. Étant nouveau pour le développement d'applications Android, je ne suis pas sûr de la cause exacte même après mes recherches. Par conséquent, je demande à quelqu'un qui est plus familier avec la trace de pile de bien vouloir m'aider.

Remarque: l'erreur se produit lorsque je clique sur l'entrée listview pour accéder à une page de modification pour l'entrée de journal. Cependant, cela ne semble pas du tout aller à la page d'édition. 

Vous trouverez ci-dessous mon code d'activité sur lequel il apparaît et la trace de la pile.

Code d'activité:

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

Voici ma trace de pile que je vois:

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)

Toute aide vers une solution sera appréciée.

MODIFIER:

Ainsi, après avoir scruté le code entre la base de données et l'activité avec laquelle elle interagit, j'ai réussi à le faire fonctionner à nouveau. Voici ce que j'ai fait dans l'ordre exact:

  1. Je me suis rendu compte que j'avais un champ de date qui ne recevait aucune donnée, j'ai rectifié cela.
  2. Nettoyé le projet.
  3. Android Studio redémarré (arrêtant toutes les opérations de l'environnement de développement).
  4. Désinstallez l'application de mon téléphone dev.
  5. Studio Android redémarré et ré-installé l'application.
  6. Je travaille en quelque sorte = _ =, oui c'est magique.

Honnêtement, je n'ai aucune idée de l'étape qui a résolu le problème. J'imagine que c'est le champ de date de la base de données qui me dérangeait alors qu'elle ne recevait aucune donnée.

7
Mohit G

Le tableau dans votre ArrayAdapter contient au moins une entrée qui est null. Il ne doit y avoir aucune valeur nulle ici.

Le tableau est rempli dans getDiaryDBDataList(), donc le problème est également là.

31
laalto

Je suppose au lieu de 

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

vous devez utiliser 

String selectedEntry = listAdapter.getItem(position);

Comme vous utilisez un adaptateur multidisque, vous ne pouvez pas obtenir l'élément sélectionné dans View 

Espérons que cela va vous aider

2
Muralikrishna G S

Initialiser "db_data_list" dans displayItems ()

ArrayList db_data_list = new ArrayList();
1
Nikunj

view comme vous l'avez nommé ici semble être non initialisé et non lié à rien

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

^ en supposant que la vue texte se trouve à l'intérieur de la vue liste_données, sinon ignore ce bit

Ensuite, dans votre code, vous voudrez également ajouter des contrôles de longueur pour 

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

Et cela aidera avec les problèmes à venir. 

1
childofthehorn

Réponse tardive mais, dans mon cas, j'ai changé le nom de la balise resources de integer-array à string-array et cela a bien fonctionné.

0
raed