检查 NullPointer setVisibility 案例

Inspecting NullPointer setVisibility case

提问人:snachmsm 提问时间:11/22/2018 最后编辑:Rohit5k2snachmsm 更新时间:11/22/2018 访问量:51

问:

在我的崩溃日志中,我偶尔会看到以下内容:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setVisibility(int)' on a null object reference
   at AbstractFragment.init(Unknown Source)
   at ExtendingFragment.onEnabled(Unknown Source)
   at ExtendingFragment.enableScrolling(Unknown Source)
   at ExtendingFragment$7.onClick(Unknown Source)
   at android.view.View.performClick(View.java:5210)

...

就这么简单,对吧?问题肯定出在 ,但是:AbstractFragment.init

void init(MyPOJO myPOJO, View.OnClickListener aListener, View.OnClickListener bListener,
                    boolean stored) {
    this.myPOJO= myPOJO;
    this.aListener = aListener;
    this.bListener = bListener;
    this.stored = stored;
    this.inflater = LayoutInflater.from(getActivity());

    used = new SparseBooleanArray();
    verticalMargin = getResources().getDimensionPixelSize(R.dimen.article_spacing_vertical);
    horizontalMargin = getResources().getDimensionPixelSize(R.dimen.article_spacing_horizontal);
    if (samsung_4_4_have_bug == null) //static
        samsung_4_4_have_bug = Build.VERSION.SDK_INT == 19 &&
                Build.MANUFACTURER.toLowerCase(Locale.getDefault()).contains("samsung");
}

这里的任何调用,实际上它只是一个“二传手”。所以也许在?让我们看看:setVisibilityExtendingFragment.onEnabled

@Override
public void onEnabled(int pendingId) {
    if (pendingId == localId && someView != null)
        someView.post(() -> someView.callOnClick());
}

不,也...里面没有,也没有电话......setVisibilityOnClickListenersetVisibilityAbstractFragment.init

在里面,我准备了几个听众,但没有电话ExtendingFragment.enableScrollingsetVisibility

ExtendingFragment$7.onClick建议这发生在一些之后,但我已经在两个片段层中检查了所有,你永远不会猜到......这些都没有电话......NullPointerOnClickOnClickListenerssetVisibility

那么如何解决这个问题呢?我正在使用一些切换,但没有在堆栈方法中列出的任何方法中。如何检查?visibility

安卓 android-layout nullpointerexception

评论

1赞 laalto 11/22/2018
看起来堆栈跟踪来自 proguard 优化的构建。优化可以内联方法等,因此堆栈跟踪并不总是准确的。在同一类中查找附近的代码。
0赞 Vladyslav Matviienko 11/22/2018
这看起来像魔术。但是Java不使用魔法。因此,要么代码不是构建崩溃应用程序的代码,要么堆栈跟踪不是来自此代码(实际上是相同的)
0赞 snachmsm 11/23/2018
@laalto您的建议可能是对的,但是我已经检查了“接近”代码,不幸的是没有找到任何电话......Proguard 必须“非常深入地”混合我的代码:/知道如何检查吗?也许 ProGuard 生成的映射文件可能有助于搜索?setVisibility
0赞 laalto 11/23/2018
另一种可能性是映射文件实际上并不属于此构建,因此反混淆的方法名称不正确。
0赞 snachmsm 11/23/2018
事实上,我已经检查过并且(可悲的是)我没有存储这些文件(用于构建,这是报告错误)。我计划在未来几天内发布更新,然后我将保留适当的文件以供进一步检查。PS.log 来自 Crashlytics,我没有看到上传映射文件的选项,但这在 GP 控制台(和 Firebase?)中是可能的。谢谢你的建议,我认为这是一个很好的线索

答: 暂无答案