Android: java.lang.NullPointerException: tentativa de chamar o método virtual 'java.lang.String java.lang.Object.toString ()' em uma referência de objeto nulo
Enfrentando um problema com um aplicativo de prática em que estou trabalhando. Estou enfrentando um problema NullPointerException relacionado ao método toString. Sendo novo no desenvolvimento de aplicativos para Android, não tenho certeza da causa exata, mesmo após minha pesquisa sobre isso. Por isso, peço que alguém que esteja mais familiarizado com o rastreamento de pilha me ajude gentilmente.
Nota: O erro ocorre quando clico na entrada listview para acessar uma página de edição da entrada do diário. No entanto, ele não parece ir para a página de edição.
Abaixo, você encontrará meu código de atividade em que ele ocorre e o rastreamento da pilha.
Código da atividade:
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);
}
}
Aqui está o meu rastreamento de pilha que eu vejo:
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)
Qualquer ajuda para uma solução será apreciada.
EDITAR:
Então, depois de olhar para frente e para trás no código entre o banco de dados e a atividade com a qual ele interage, consegui fazê-lo funcionar novamente. Abaixo está o que eu fiz na ordem exata:
Percebi que tinha um campo de data que não estava recebendo dados, retifiquei isso.Limpou o projeto.Reiniciei o Android Studio (basicamente parando todas as operações do ambiente de desenvolvimento).Desinstalou o aplicativo do meu telefone de desenvolvimento.Reiniciou o android studio e reinstalou o aplicativo.De alguma forma, funciona = _ =, sim, é mágico.Honestamente, não tenho idéia de qual etapa realmente o resolveu. Acho que era o campo de data no banco de dados que estava bagunçando as coisas para mim enquanto não recebia dados.