【问题标题】:Cannot find reason for NullPointerException in Android App在 Android 应用程序中找不到 NullPointerException 的原因
【发布时间】: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


【解决方案1】:

问题是我有一个不包括微调器的替代布局

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 2012-03-29
    • 2019-05-05
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多