Android Kotlin WebView应用运行出现NullPointerException报错如何解决
问题根因
崩溃由两个代码问题共同触发:
- 变量遮蔽:类顶部声明的全局
webView变量初始值为null,onCreate方法中又用val webView = findViewById<WebView>(R.id.webView)重新定义了同名局部变量,全局的webView始终没有被赋值,一直为null - 不安全的非空断言:
onBackPressed方法中使用!!对全局空的webView做强制非空转换,直接触发空指针异常
修复方案
将全局webView改为lateinit非空类型,onCreate中直接给全局变量赋值即可,修复后完整代码如下:
package com.fabledBits.roll4init import android.app.Activity import android.os.Bundle import android.webkit.WebView import android.webkit.WebViewClient class MainActivity : Activity() { // 声明非空全局变量,晚些再初始化 private lateinit var webView: WebView override fun onBackPressed() { if (webView.isFocused && webView.canGoBack()) { webView.goBack() } else { super.onBackPressed() } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) title = "roll4init" // 直接给全局变量赋值,不要加val重复声明局部变量 webView = findViewById<WebView>(R.id.webView) webView.webViewClient = WebViewClient() webView.loadUrl("http://google.com") val webSettings = webView.settings webSettings.javaScriptEnabled = true webSettings.domStorageEnabled = true webSettings.allowFileAccess = true } }
可选兼容方案
如果不能确定布局中一定存在对应id的WebView,可以用可空类型加空安全调用避免崩溃:
class MainActivity : Activity() { private var webView: WebView? = null override fun onBackPressed() { webView?.let { if (it.isFocused && it.canGoBack()) { it.goBack() return } } super.onBackPressed() } // onCreate代码和上面一致,直接给webView赋值即可 }
内容的提问来源于stack exchange,提问作者Keith
相关产品推荐
相关产品推荐

