【问题标题】:Null pointer Exception when compiling编译时出现空指针异常
【发布时间】:2017-07-14 20:56:48
【问题描述】:

我从 android stuido 开发了一个简单的 webview 应用程序,它将在在线时加载页面的 url,并在离线时显示缓存文件。但我不断收到

的错误
 Null pointer Exception
    at java.lang.reflect.Method.invoke(Native Method)                                                                           
atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit
.java:726)                                                                                 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

下面是我来自 Mainactivity .java 的代码

package com.example.sagar.cdproutine;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Context context = null;
        WebView webView = new WebView(context);
        webView.getSettings().setAppCacheMaxSize(5 * 1024 * 1024); // 5MB
        webView.getSettings().setAppCachePath(
            getApplicationContext().getCacheDir().getAbsolutePath());
        webView.getSettings().setAllowFileAccess(true);
        webView.getSettings().setAppCacheEnabled(true);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); // load online by default

        if (!isNetworkAvailable()) { // loading offline
            webView.getSettings().setCacheMode(
                WebSettings.LOAD_CACHE_ELSE_NETWORK);
        }

        webView.loadUrl("http://www.sagarrawal.com.np");
    }

    private boolean isNetworkAvailable() {
        ConnectivityManager connectivityManager = (ConnectivityManager)
        getSystemService(CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo =
            connectivityManager.getActiveNetworkInfo();
        return activeNetworkInfo != null;
    }
}

从我的 manifest.xml 文件中

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.sagar.cdproutine">

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

我认为是 Context 导致了问题,但我不知道如何解决。 任何帮助将不胜感激。

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

【问题讨论】:

标签: android caching webview nullpointerexception android-context


【解决方案1】:

我错过了什么吗? 此处的这一行为空,您将其传递给 Web 视图。

上下文上下文 = null;

试试这样的:

WebView webView = new WebView(getApplicationContext());

【讨论】:

  • 感谢大卫的快速回复,是的,我按照你的建议做了。我删除了行 Context context = null; WebView webView = new WebView(context);取而代之的是我错过了什么吗?此处的这一行为空,您将其传递给 Web 视图。上下文上下文 = null;尝试这样的事情: WebView webView = new WebView(getApplicationContext());但现在该应用程序只显示一个白屏,如果我用“www.google.com”替换 url “www.sagarrawal.com.np”,那么它会从手机 Internet 浏览器而不是 webview 本身打开。
【解决方案2】:

正如大卫所说,不要传递空上下文

这是在 OnCreate 中

webView = (WebView) findViewById(R.id.webView);
initWebView();//Initialize the WebView
webView.loadUrl(url);//pass your Url

对于 initWebView();

private void initWebView() {
    webView.setWebChromeClient(new MyWebChromeClient(this));
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);        
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            webView.loadUrl(url);
            return true;
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
        }

        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
        }
    });
    webView.clearCache(true);
    webView.clearHistory();
    webView.getSettings().setJavaScriptEnabled(true);
    webView.setHorizontalScrollBarEnabled(false);
}

对于 MyWebChromeClient,请执行以下操作:

private class MyWebChromeClient extends WebChromeClient {
    Context context;

    public MyWebChromeClient(Context context) {
        super();
        this.context = context;
    }


}

另请参阅此参考资料-link

【讨论】:

  • 我真的很感谢你们的建议,但是当我在 OnCreate webView.setWebViewClient(new WebViewController());我得到它的错误是一个静态方法所以无法解决。我按照stackoverflow的教程制作了这个应用程序。所以我不知道这段代码的位置。在这里,我已将我的项目上传到 Git 中心,如果有人可以从项目文件中编辑并给我代码 github.com/BlueYeti1881/CDPRoutine000,这对我来说意义重大
  • 感谢诺和卢卡斯的慷慨努力。在我重置我的项目之前,我很好奇我应该把第二行代码从 private void initWebView() 到 webView.setHorizo​​ntalScrollBarEnabled(false); }。如果我需要在我的初始代码中的 private boolean isNetworkAvailable() { 之后放置 if ,还是需要将它放在上下文之前,并且正如您所提到的那样 webView.clearCache(true); webView.clearHistory();在您的代码中,但我想缓存网页,以便用户即使在离线时仍然可以阅读。我在这里想念什么吗。请帮忙。
  • 是的,您可以在 OnCreate 之外的任何位置添加此方法。试试看 webVIew 是否先加载,你可以做缓存的东西
  • 我不知道我做错了什么,但我完全搞砸了。这是截图imgur.com/a/Jlndm请看一下
  • 您自己让事情变得非常复杂,您需要先处理基础知识。彻底检查mkyong.com/android/android-webview-example,首先尝试做 WebView 的基本实现
猜你喜欢
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 2013-10-29
  • 2021-02-15
相关资源
最近更新 更多