NullPointerException with string-array in Spinner
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:394)
at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:193)
at android.widget.Spinner.onMeasure(Spinner.java:482)
This tells you that the error was measuring the Spinner
. More exactly, one of the strings that should be displayed inside it is null.
The most likely cause is a problem with the @array/arraySplitr
resource. Is it a valid string-array
resource as defined in the documentation?
This:
<array name="arraySplitr">
<item>2</item>
...
should be instead:
<string-array name="arraySplitr">
<item>2</item>
...
The array
element is for Typed Arrays. String arrays must use string-array
.
wakoquacko
Updated on July 23, 2022Comments
-
wakoquacko almost 2 years
First app and so really new at android (played around about a year ago but nothing came of it), decent at programming. Wanting to make sure app renders on a phone, no functionality atm. Compiles fine, no problems there. Push it to my phone and "Unfortunately, Splitr has stopped".
Edit - added to the MainActivity.java, edits have * before and after (not in actual code) but now it flags
adapter.setDropDownViewResource(android.R.layout.activity_main); // Apply the adapter to the spinner spinnerSplit.setAdapter(adapter);
saying Error:(18, 36) identifier expected
setDropDownViewResource, activity_main and setAdapter all in red
Android Studio
Moto G - CM11 4.4.4Here is the code, let me know if I missed anything out.
MainActivity.java
package com.hydr0dr4gon.splitrv2; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; *import android.widget.ArrayAdapter; import android.widget.Spinner;* public class MainActivity extends Activity { *Spinner spinnerSplit = (Spinner) findViewById(R.id.spinner); // Create an ArrayAdapter using the string array and a default spinner layout ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.arraySplitr, android.R.layout.simple_spinner_item); // Specify the layout to use when the list of choices appears adapter.setDropDownViewResource(android.R.layout.activity_main); // Apply the adapter to the spinner spinnerSplit.setAdapter(adapter);* @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }
SplitrDialogFragment.java
package com.hydr0dr4gon.splitrv2; import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.content.DialogInterface; import android.os.Bundle; public class SplitrDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Use the Builder class for convenient dialog construction AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage(R.string.dialog_split_pay) .setNegativeButton(R.string.OK, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // User cancelled the dialog } }); // Create the AlertDialog object and return it return builder.create(); } }
Strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Splitr</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <string name="btnSplit">Split</string> <string name="btnTip">+ Tip</string> <string name="txtSplit">Split By</string> <string name="txtHint">Enter Bill Total</string> <string name="spinnerSplit">No. of People</string> <string name="dialog_split_pay">Each Person Pays</string> <string name="OK">OK</string> <array name="arraySplitr"> <item>2</item> <item>3</item> <item>4</item> <item>5</item> <item>6</item> <item>7</item> <item>8</item> <item>9</item> <item>10</item> </array>
actvity_main.xml
RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.hydr0dr4gon.splitr.MainActivity"> <TableLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:paddingLeft="40dp" android:paddingTop="80dp" android:paddingRight="40dp" android:paddingBottom="80dp"> <TableRow android:layout_width="fill_parent" android:layout_height="fill_parent"> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_span="2" android:inputType="number" android:ems="10" android:id="@+id/editText" android:layout_column="0" android:layout_weight="1.5" android:hint="@string/txtHint" /> </TableRow> <TableRow android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="0dp" android:layout_height="match_parent" android:text="@string/txtSplit" android:id="@+id/txtSplit" android:layout_weight="1" android:textSize="32dp" android:textAlignment="center" android:gravity="center" /> <Spinner android:layout_width="0dp" android:layout_height="match_parent" android:id="@+id/spinner" android:layout_weight="1" android:spinnerStyle="@android:style/Widget.Spinner.DropDown" android:textAlignment="center" android:entries="@array/arraySplitr" android:prompt="@string/spinnerSplit"/> </TableRow> <TableRow android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/btnTip" android:id="@+id/btnTip" android:layout_weight="1" /> <Button android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/btnSplit" android:id="@+id/btnSplit" android:layout_weight="1" /> </TableRow> </TableLayout>
logcat
> 07-11 21:18:50.899 10290-10290/com.hydr0dr4gon.splitrv2 D/ActivityThread﹕ handleBindApplication:com.hydr0dr4gon.splitrv2 07-11 21:18:50.899 10290-10290/com.hydr0dr4gon.splitrv2 D/ActivityThread﹕ setTargetHeapUtilization:0.75 07-11 21:18:50.899 10290-10290/com.hydr0dr4gon.splitrv2 D/ActivityThread﹕ setTargetHeapMinFree:2097152 07-11 21:18:51.198 10290-10290/com.hydr0dr4gon.splitrv2 D/AndroidRuntime﹕ Shutting down VM 07-11 21:18:51.206 10290-10290/com.hydr0dr4gon.splitrv2 E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.hydr0dr4gon.splitrv2, PID: 10290 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:394) at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362) at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:193) at android.widget.Spinner.onMeasure(Spinner.java:482) at android.view.View.measure(View.java:16521) at android.widget.TableRow.getColumnsWidths(TableRow.java:312) at android.widget.TableLayout.findLargestCells(TableLayout.java:508) at android.widget.TableLayout.measureVertical(TableLayout.java:473) at android.widget.TableLayout.onMeasure(TableLayout.java:439) at android.view.View.measure(View.java:16521) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455) at android.view.View.measure(View.java:16521) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.view.View.measure(View.java:16521) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327) at android.view.View.measure(View.java:16521) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2552) at android.view.View.measure(View.java:16521) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1912) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1109) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1291) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) at android.view.Choreographer.doCallbacks(Choreographer.java:574) at android.view.Choreographer.doFrame(Choreographer.java:544) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5137) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
Thanks.
-
wakoquacko almost 10 yearsyeah might help if I had one of those.
-
JustWannaFly almost 10 yearsit's the 'virtual method' description that makes me wonder if this is the culprit. Thankfully the android is pretty well documented which helps with learning new parts. Here is the documentation for ArrayAdapters. developer.android.com/reference/android/widget/…
-
matiash almost 10 years@wakoquacko Please include the xml of that resource in your post. I'm pretty convinced the error is related to that. :)
-
wakoquacko almost 10 yearsIncluded as requested - Strings.xml
-
wakoquacko almost 10 yearschanged and get Error:(59, 34) No resource found that matches the given name (at 'entries' with value '@string-array/arraySplitr'). in response yet it is clearly there
-
matiash almost 10 years@wakoquacko You need only change the definition. The reference is fine with
@array/arraySplitr
. -
wakoquacko almost 10 yearsThat go rid of that but still got error. See top of post
-
matiash almost 10 years@wakoquacko I don't think the code between asterisks is needed.
-
wakoquacko almost 10 yearsyup not needed, removed, fixed. At least for now until I break it tomorrow, but now sleep. Thanks alot
-
FOliveira over 9 yearsthis works for me but it was impossible for me to figure this out since i had used the same thing for a previous dialog with a <array> and worked perfectly
-
Arpit Patel almost 8 yearsi am using programmatically String[] property in that case what should i do??
-
mDonmez over 6 yearswhen i encountered same error, i realized that one of items has no entry in default Strings.xml file. I have two strings.xml for two langugaes. one of strings has @string/ready entry but default file has not. i added it and works.
-
Vlad over 5 yearsGuy, you saved my day :)!