2017-07-14 141 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是否先載入,你可以做緩存的東西 –