huburt-Hu / NewbieGuide

Android 快速实现新手引导层的库,通过简洁链式调用,一行代码实现引导层的显示
Apache License 2.0
3.56k stars 521 forks source link

遇到的空指针异常getRectF(),源码部分如下 #74

Open Doonkey opened 6 years ago

Doonkey commented 6 years ago

同样遇到类似的问题,那也不应该抛异常吧?看了源码里面,请教个问题,里面抛了异常,是在什么地方捕获的呢? com.app.hubert.guide.util.ViewUtils.getLocationInView(View parent, View child){}


public static Rect getLocationInView(View parent, View child) {
if(child != null && parent != null) { //此处判读了非空情况
View decorView = null;
Context context = child.getContext();
if(context instanceof Activity) {
decorView = ((Activity)context).getWindow().getDecorView();
}
        Rect result = new Rect();
        Rect tmpRect = new Rect();
        View tmp = child;
        if(child == parent) {
            child.getHitRect(result);
            return result;
        } 
else {
            while(tmp != decorView && tmp != parent) {//此处也应该判断非空的情况,捕获该异常,结束后续操作,因为在while循环的时候,此处可能为空了
                tmp.getHitRect(tmpRect);
                if(!tmp.getClass().equals("NoSaveStateFrameLayout")) {
                    result.left += tmpRect.left;
                    result.top += tmpRect.top;
                }

                tmp = (View)tmp.getParent();
                if(tmp != null && tmp.getParent() != null && tmp.getParent() instanceof ViewPager) {
                    tmp = (View)tmp.getParent();
                }
            }

            result.right = result.left + child.getMeasuredWidth();
            result.bottom = result.top + child.getMeasuredHeight();
            return result;
        }
    } else {
        throw new IllegalArgumentException("parent and child can not be null .");
    }
}`
Doonkey commented 6 years ago

请大佬关注一下,我直接在依赖中看的源码,却没有发现捕获异常的地方,难道是我多虑了吗?

huburt-Hu commented 6 years ago

这里的异常不应该捕获,因为这里抛出异常的情况是:传入的高亮View没有初始化(也就是为null),或者并没有在界面上展示。抛出这种异常表示使用的方式有误,并没有在合适的时机显示引导层,需要调整使用时机。