2017-07-14 137 views
-2

我从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"/> 

我认为语境是造成这个问题,但我不知道如何解决它。 任何帮助将主要赞赏。

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

+2

可能的复制(HTTPS:/ /stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – Selvin

回答

0

我这么想吗? 这条线在这里是空的,你将它传递给Web视图。

上下文context = null;

尝试是这样的:

的WebView webView的=新的WebView(getApplicationContext());

+0

感谢大卫的快速回复,是的,我按你的建议。我删除了行 上下文context = null; WebView webView =新的WebView(上下文);并替换为\t 我错过了什么?这行这里是空的,你传递给Web视图。 上下文context = null; 尝试类似这样的: WebView webView = new WebView(getApplicationContext());但现在应用程序不会显示任何东西只有一个白色的屏幕,如果我用“www.sagarrawal.com.np”与“www.google.com”替换url,那么它会从手机互联网浏览器而不是webview本身打开。 –

0

正如大卫提到不传递空的上下文

这是在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做到这一点:什么是一个NullPointerException,以及如何解决它]

private class MyWebChromeClient extends WebChromeClient { 
    Context context; 

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


} 

也期待在这个参比link

+0

我真的很感激你的建议家伙,但它仍然不工作,当我在OnCreate中添加这个 webView.setWebViewClient(新的WebViewController());我得到它的错误是一个静态方法,所以无法解决。我根据教程的计算器制作了这个应用程序。所以我不知道这个代码的位置。这里我已经把我的项目上传到Git hub了,如果任何人都可以从项目文件中编辑并给我代码https://github.com/BlueYeti1881/CDPRoutine000 –

+0

,那对我来说意味着很多。感谢Novo Lucas的慷慨努力。在我重置我的项目之前,我很好奇我应该把第二行代码从private void initWebView()发送到webView.setHorizo​​ntalScrollBarEnabled(false); }。我应该需要放置后 私人布尔isNetworkAvailable(){从我的初始代码,或者我需要把它放在上下文之前,因为你已经提到,webView.clearCache(true); webView.clearHistory();在你的代码中,但我想要缓存网页,以便用户即使在离线状态下仍可以阅读。我在这里想念什么。请帮忙。 –

+0

是的,你可以在OnCreate之外的任何位置添加此方法。试试看webVIew是否先载入,你可以做缓存的东西 –