web-dev-qa-db-ja.com

Android:Java.lang.NullPointerException:nullオブジェクト参照で仮想メソッド「Java.lang.String Java.lang.Object.toString()」を呼び出そうとしました

私が取り組んでいる練習アプリで問題に直面しています。 toStringメソッドに関連するNullPointerException問題に直面しています。 Androidアプリ開発に慣れていないので、これを調べた後でも正確な原因はわかりません。したがって、スタックトレースに精通している人に親切に助けてもらいます。

注:リストビューエントリをクリックしてダイアリーエントリの編集ページにアクセスすると、エラーが発生します。ただし、編集ページにはまったくアクセスしていないようです。

以下に、それが発生するアクティビティコードとスタックトレースを示します。

アクティビティコード:

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 studioを再起動し、アプリを再インストールしました。
  6. 私は何とか動作します= _ =、はい、それは魔法です。

正直なところ、どのステップで実際に解決したのかわかりません。データを受け取っていない間、データベースの日付フィールドが混乱していたと推測しています。

9
Mohit G

ArrayAdapterの配列には、nullであるエントリが少なくとも1つ含まれています。そこにヌルがあってはなりません。

配列はgetDiaryDBDataList()に格納されているため、問題もあります。

33
laalto

遅い答えですが、私の場合は、リソースタグ名をinteger-arrayからstring-arrayそして、それはうまく働きました。

2
raed

代わりに

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

あなたは使わなければなりません

String selectedEntry = listAdapter.getItem(position);

アレイアダプターを使用しているため、ビューから選択したアイテムを取得できません。

これがあなたを助けることを願っています

2

DisplayItems()で「db_data_list」を初期化します

ArrayList db_data_list = new ArrayList();
1
Nikunj

viewここで名前を付けたように、初期化されておらず、何にも結び付けられていないようです

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

^ textviewが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

そして、これは今後の問題に役立ちます。

1
childofthehorn