我偶尔会因用户触发此异常而无法重现。因为它是从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)
问题是 - 这是否会关闭应用程序?我该如何解决这个错误?
答案 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
语句失败并且永远不会执行违规代码