当前位置: 首页 > 面试题库 >

Android:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ java.lang.String java.lang.Object.toString()”

东郭兴学
2023-03-14
问题内容

面对我正在使用的练习应用程序的问题。我面临与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. 我以某种方式工作= _ =,是的,这很神奇。

老实说,我不知道哪一步真正解决了它。我猜这是数据库中的日期字段在我没有收到任何数据的同时给我带来了麻烦。


问题答案:

您的阵列中ArrayAdapter至少包含一个条目null。那里不能有空值。

数组被填充,getDiaryDBDataList()所以问题也在那里。



 类似资料:
  • 问题内容: 我收到以下错误 尝试在空对象引用上调用虚拟方法’void android.widget.StackView.setAdapter(android.widget.Adapter)’ 在这条线上 完整的片段 EventsFragment.java 是 Stack_Adapter.java Stack_Items 问题答案: 您正在执行: 你是。返回。 你为什么用? 在哪里?您应该从正确的x

  • 我的应用程序有问题,想解决它,但我无法访问解决方案,请帮帮我,,

  • 我正在尝试实现一个外部色轮,它应该出现在的片段一直在崩溃我的应用程序。我想我明白为什么会发生这种情况,但是在尝试修复它大约6个小时后,我就要放弃了。我知道之前有人问过这个问题,但是我无法为我的特定问题导出一个修复程序。下面是我的代码: 这是Logcat错误: 如果有人能帮我解决这个问题,那就太好了。提前谢谢^^ 编辑:这是我的XML,按要求:

  • 问题内容: 我尝试使用片段来打开数据库,但是,当我单击按钮开始搜索时,程序意外终止,并显示如下错误: 主片段: DBManager类: 顺便说一句,我在MainAcitivity中使用了有关DBManager的代码,并且成功了。将代码复制到上面的片段后,它失败了,该怎么办? 问题答案: 之前和之后你都做不到。 因为,您正在执行片段实例化时。该方法将始终返回null。另外,尽量不要将参考文献保留在您

  • 问题内容: 我正在尝试将播放器的名称保存为共享的首选项,并通过再次以共享的首选项获取它的名称来使其显示在另一个活动中,但是我的应用程序崩溃了。 致命异常:主要 代码: 播放器 PlayGame.java PlayerName.java 问题答案: 您的应用在以下位置崩溃: 因为。 您忘记在PlayGame活动中进行初始化。

  • 我面临着这个错误: 主要活动: 谢谢你的帮助。