【发布时间】:2020-09-06 13:29:57
【问题描述】:
我正在编写一个 Android 应用程序。一些用户在启动时收到NullPointerException,但我找不到原因(在我的手机和 6 个不同的 AVD 上它可以工作,我无法重现异常,所以我可以查看我的 Android Studio 中的错误并在那里玩) .
PlayConsole 为我的用户显示此错误日志。我的知识太少,无法从这个日志中找出原因。谁能看出原因?
错误日志:
java.lang.NullPointerException:
at de.schwembo.beercount.AuswertungFragment.onCreateView (AuswertungFragment.java:85)
at androidx.fragment.app.Fragment.performCreateView (Fragment.java:2600)
at androidx.fragment.app.FragmentManagerImpl.moveToState (FragmentManagerImpl.java:881)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState (FragmentManagerImpl.java:1238)
at androidx.fragment.app.FragmentManagerImpl.moveToState (FragmentManagerImpl.java:1303)
at androidx.fragment.app.BackStackRecord.executeOps (BackStackRecord.java:439)
at androidx.fragment.app.FragmentManagerImpl.executeOps (FragmentManagerImpl.java:2079)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether (FragmentManagerImpl.java:1869)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute (FragmentManagerImpl.java:1824)
at androidx.fragment.app.FragmentManagerImpl.execSingleAction (FragmentManagerImpl.java:1696)
at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss (BackStackRecord.java:299)
at androidx.fragment.app.FragmentPagerAdapter.finishUpdate (FragmentPagerAdapter.java:235)
at androidx.viewpager.widget.ViewPager.populate (ViewPager.java:1244)
at androidx.viewpager.widget.ViewPager.populate (ViewPager.java:1092)
at androidx.viewpager.widget.ViewPager.onMeasure (ViewPager.java:1622)
at android.view.View.measure (View.java:22286)
at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6668)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasureChild (CoordinatorLayout.java:760)
at com.google.android.material.appbar.HeaderScrollingViewBehavior.onMeasureChild (HeaderScrollingViewBehavior.java:99)
at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onMeasureChild (AppBarLayout.java:1892)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasure (CoordinatorLayout.java:831)
at android.view.View.measure (View.java:22286)
at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6668)
at android.widget.FrameLayout.onMeasure (FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure (ContentFrameLayout.java:143)
at android.view.View.measure (View.java:22286)
at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6668)
at android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1539)
at android.widget.LinearLayout.measureVertical (LinearLayout.java:823)
at android.widget.LinearLayout.onMeasure (LinearLayout.java:702)
at android.view.View.measure (View.java:22286)
at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6668)
at android.widget.FrameLayout.onMeasure (FrameLayout.java:185)
at android.view.View.measure (View.java:22286)
at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6668)
at android.widget.LinearLayout.measureChildBeforeLayout (LinearLayout.java:1539)
at android.widget.LinearLayout.measureVertical (LinearLayout.java:823)
at android.widget.LinearLayout.onMeasure (LinearLayout.java:702)
at android.view.View.measure (View.java:22286)
at android.view.ViewGroup.measureChildWithMargins (ViewGroup.java:6668)
at android.widget.FrameLayout.onMeasure (FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure (DecorView.java:837)
at android.view.View.measure (View.java:22286)
at android.view.ViewRootImpl.performMeasure (ViewRootImpl.java:2646)
at android.view.ViewRootImpl.measureHierarchy (ViewRootImpl.java:1674)
at android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1933)
at android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1558)
at android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:7463)
at android.view.Choreographer$CallbackRecord.run (Choreographer.java:1041)
at android.view.Choreographer.doCallbacks (Choreographer.java:847)
at android.view.Choreographer.doFrame (Choreographer.java:774)
at android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:1027)
at android.os.Handler.handleCallback (Handler.java:809)
at android.os.Handler.dispatchMessage (Handler.java:102)
at android.os.Looper.loop (Looper.java:166)
at android.app.ActivityThread.main (ActivityThread.java:7555)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:469)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:963)
受影响的函数(AuswertungFragment.java:85)是这个,它在onCreateView()方法内部:
// Spinner for Months differentiation
spinnerMonat.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
// IF statement for year/gesamt selection
if (spinnerMonat.getSelectedItem().toString().equals(getString(R.string.gesamt))) {
for (int i = 0; i < 12; i++) {
alleDatenAusCursor = dataSource.zaehleAllesZuCursor(dataSource.getCursorFuerMonat(i + 1));
anzahlZuMonate[i] = String.valueOf(alleDatenAusCursor[0]);
preisZuMonate[i] = String.valueOf(alleDatenAusCursor[1]);
mengeZuMonate[i] = String.valueOf(alleDatenAusCursor[2]);
}
fuelleLV4(monate, anzahlZuMonate, preisZuMonate, mengeZuMonate);
} else {
for (int i = 0; i < 12; i++) {
alleDatenAusCursor = dataSource.zaehleAllesZuCursor(dataSource.getCursorFuerMonatJahr(spinnerMonat.getSelectedItem().toString(), i + 1));
anzahlZuMonate[i] = String.valueOf(alleDatenAusCursor[0]);
preisZuMonate[i] = String.valueOf(alleDatenAusCursor[1]);
mengeZuMonate[i] = String.valueOf(alleDatenAusCursor[2]);
}
fuelleLV4(monate, anzahlZuMonate, preisZuMonate, mengeZuMonate);
}
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
for (int i = 0; i < 12; i++) {
alleDatenAusCursor = dataSource.zaehleAllesZuCursor(dataSource.getCursorFuerMonat(i + 1));
anzahlZuMonate[i] = String.valueOf(alleDatenAusCursor[0]);
preisZuMonate[i] = String.valueOf(alleDatenAusCursor[1]);
mengeZuMonate[i] = String.valueOf(alleDatenAusCursor[2]);
}
fuelleLV4(monate, anzahlZuMonate, preisZuMonate, mengeZuMonate);
}
});
dataSource 在onCreate() 方法中初始化如下:
dataSource = new DatabaseHandler(getActivity());
Spinner 在onCreateView() 方法中初始化如下:
final Spinner spinnerMonat = rootView.findViewById(R.id.spinnerMonth2);
【问题讨论】:
-
我不知道是不是这种情况,但我强烈建议对不变的事物使用
equals方法。这段代码:spinnerMonat.getSelectedItem().toString().equals(getString(R.string.gesamt))可能会产生一个 nullPointer,例如getSelectedItem 返回空值。如果你还原等号:getString(R.string.gesamt).equals(spinnerMonat.getSelectedItem().toString()),如果getSeletctedItem返回null,则不会抛出nullpointer。 -
该行上的 NPE 意味着
spinnerMonat为空。您是否有该片段的布局在其他配置中有所不同,例如layout-land,没有spinnerMonth2? -
天哪,非常感谢您的提示,我太愚蠢了。我有一个用于较小屏幕的替代布局,我没有更改。另外感谢Embid的提示,我也更改了该代码
标签: java android android-fragments nullpointerexception