0

我偶尔会收到用户触发的此异常,我无法重现。由于它是从 looper 发出的,我想它是 Handler 类型回调的结果。我在 Google 代码中发现了类似的错误,但将解决方案放入代码中并没有解决它。问题在于BrowserFrame中的这行代码:

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

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

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)

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

4

1 回答 1

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()

The only place where mCallbackProxy is set is in BrowserFrame constructor which gets null for CallbackProxy parameter for whatever reason. Since I cannot try/catch this code (It is called from Looper) the only way I can deal with this error is to set WebSettings#setSavePassword(false) when I initialize WebView in my code. In which case IF statement fails and offending code is never executed

于 2009-11-24T22:22:28.750 回答