Android - BrowserFrame中的NPE

时间:2009-11-19 18:59:23

标签: android nullpointerexception

我偶尔会因用户触发此异常而无法重现。因为它是从looper发出的,所以我认为它是Handler类型回调的结果。我在Google代码上找到了similar bug,但是将解决方案放入代码并没有解决问题。问题出现在code in BrowserFrame

这一行
WebAddress uri = new WebAddress(
    mCallbackProxy.getBackForwardList().getCurrentItem()
   .getUrl());

抛出此异常,因为我认为mCallbackProxy为null

java.lang.NullPointerException
at android.webkit.BrowserFrame.handleMessage(BrowserFrame.java:348)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:471)
at java.lang.Thread.run(Thread.java:1060)

问题是 - 这是否会关闭应用程序?我该如何解决这个错误?

1 个答案:

答案 0 :(得分:2)

所以我花了一些时间来研究这个问题。错误来自BrowserFrame中的此代码:

        case FRAME_COMPLETED: {
            if (mSettings.getSavePassword() && hasPasswordField()) {
                if (WebView.DEBUG) {
                    Assert.assertNotNull(mCallbackProxy.getBackForwardList()
                            .getCurrentItem());
                }
                WebAddress uri = new WebAddress(
                        mCallbackProxy.getBackForwardList().getCurrentItem()
                        .getUrl());
                String schemePlusHost = uri.mScheme + uri.mHost;
                String[] up = mDatabase.getUsernamePassword(schemePlusHost);
                if (up != null && up[0] != null) {
                    setUsernamePassword(up[0], up[1]);
                }
            }
            CacheManager.trimCacheIfNeeded();
            break;
        }

特别是从这一行

  WebAddress uri = new WebAddress(
                        mCallbackProxy.getBackForwardList().getCurrentItem()

设置mCallbackProxy的唯一位置是BrowserFrame构造函数,无论出于何种原因,它都会为CallbackProxy参数获取null。由于我无法尝试/捕获此代码(它是从Looper调用的),我处理此错误的唯一方法是在我的代码中初始化WebSettings#setSavePassword(false)时设置WebView。在这种情况下IF语句失败并且永远不会执行违规代码