尝试在空对象引用

时间:2015-05-23 19:56:38

标签: java android nullpointerexception

我正在尝试检查我的应用程序是否是第一次启动。如果是,则要求用户输入。然后,检查是否已连接Wi-Fi。如果连接了Wi-Fi,我会使用用户提供的输入来加载WebView。

但是,应用程序在启动时因错误而崩溃

  

尝试在空对象引用上调用虚方法'java.lang.Object android.content.Context.getSystemService(java.lang.String)'

代码

public class MainActivity extends Activity {


ProgressBar progressbar;
WebView webView;
LayoutInflater li = LayoutInflater.from(getBaseContext());
View promptsView = li.inflate(R.layout.propmt, null);
String URL;

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    this.getWindow().requestFeature(Window.FEATURE_PROGRESS);
    setContentView(R.layout.activity_main);

    Boolean isFirstRun = getSharedPreferences("PREFERENCE", MODE_PRIVATE)
            .getBoolean("isFirstRun", true);

    if (isFirstRun) {

        otherWork(promptsView);

    }


       getSharedPreferences("PREFERENCE", MODE_PRIVATE).edit()
                .putBoolean("isFirstRun", false).commit();





    ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
    NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

    if (mWifi.isConnected()) {


    getWindow().setFeatureInt( Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON);

    webView = (WebView) findViewById(R.id.webView);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.getSettings().setDisplayZoomControls(false);
    webView.getSettings().setRenderPriority(RenderPriority.HIGH);
    webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
    if (Build.VERSION.SDK_INT >= 19) {
        webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
    }       
    else {
        webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }
    webView.loadUrl(URL);
    webView.setWebViewClient(new WebViewClient());
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);



       webView.setWebViewClient(new MyWebViewClient());

       progressbar=(ProgressBar)findViewById(R.id.progressBar); 

       webView.setWebChromeClient(new WebChromeClient() {

       // this will be called on page loading progress

       @Override

       public void onProgressChanged(WebView view, int newProgress) {

               super.onProgressChanged(view, newProgress);


               progressbar.setProgress(newProgress);
               //loadingTitle.setProgress(newProgress);
               // hide the progress bar if the loading is complete

               if (newProgress == 100) {
               progressbar.setVisibility(View.GONE);

               } else{
               progressbar.setVisibility(View.VISIBLE);

               }

               }

            });

       } else {

           AlertDialog.Builder AD = new AlertDialog.Builder(this);
            AD.setIcon(R.drawable.ic_launcher);
            AD.setTitle("Not Connected To Wi-Fi/WLAN");
            AD.setMessage("You need an Active Wi-Fi/WLAN on Alliance Broadband Network");
            AD.setPositiveButton(android.R.string.ok, new OnClickListener() {

                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    finish();

                }
            });
            AD.show();

       }


} 

public void otherWork(View promptsView) {
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
            this);

    // set prompts.xml to alertdialog builder
    alertDialogBuilder.setView(promptsView);

    final EditText userInput = (EditText) promptsView
            .findViewById(R.id.editTextDialogUserInput);

    // set dialog message
    alertDialogBuilder
    .setCancelable(false)
    .setPositiveButton("OK",
            new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog,int id) {
            // get user input and set it to result
            // edit text
            //result.setText(userInput.getText());
            SharedPreferences pos;
            String fileName = "file";

            pos = getSharedPreferences(fileName, 0);
            SharedPreferences.Editor editor = pos.edit();
            editor.putString("pwd", userInput.getText().toString());      
            editor.commit();

            pos = getSharedPreferences(fileName, 0);
            String data = pos.getString("pwd", "");


            URL = data.toString();

        }
    })
    .setNegativeButton("Cancel",
            new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog,int id) {
            dialog.cancel();
        }
    });

    // create alert dialog
    AlertDialog alertDialog = alertDialogBuilder.create();

    // show it
    alertDialog.show();
}


       @Override
       public boolean onKeyDown(int keyCode, KeyEvent event) {

       if(keyCode == KeyEvent.KEYCODE_BACK){
           finish();
         }
       return super.onKeyDown(keyCode, event);
       }

       private class MyWebViewClient extends WebViewClient {


     @Override
     public boolean shouldOverrideUrlLoading(WebView view, String url) {

     view.loadUrl(url);
     return true;
     }
     }<br>

logcat的

05-24 01:11:19.279: E/AndroidRuntime(3719): FATAL EXCEPTION: main
05-24 01:11:19.279: E/AndroidRuntime(3719): Process: com.mavenmaverick.ipconnect, PID: 3719
05-24 01:11:19.279: E/AndroidRuntime(3719): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mavenmaverick.ipconnect/com.mavenmaverick.ipconnect.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
05-24 01:11:19.279: E/AndroidRuntime(3719):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2209)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at android.app.ActivityThread.access$800(ActivityThread.java:144)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at android.os.Handler.dispatchMessage(Handler.java:102)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at android.os.Looper.loop(Looper.java:135)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at android.app.ActivityThread.main(ActivityThread.java:5221)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at java.lang.reflect.Method.invoke(Native Method)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at java.lang.reflect.Method.invoke(Method.java:372)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
05-24 01:11:19.279: E/AndroidRuntime(3719): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
05-24 01:11:19.279: E/AndroidRuntime(3719):     at android.view.LayoutInflater.from(LayoutInflater.java:219)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at com.mavenmaverick.ipconnect.MainActivity.<init>(MainActivity.java:47)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at java.lang.reflect.Constructor.newInstance(Native Method)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at java.lang.Class.newInstance(Class.java:1572)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at android.app.Instrumentation.newActivity(Instrumentation.java:1065)
05-24 01:11:19.279: E/AndroidRuntime(3719):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199)
05-24 01:11:19.279: E/AndroidRuntime(3719):     ... 10 more

2 个答案:

答案 0 :(得分:6)

  

LayoutInflater li = LayoutInflater.from(getBaseContext());

首先,您不需要getBaseContext(),也不需要LayoutInflater.from()。使用getLayoutInflater()

其次,除非在某些情况下,否则在Activity之后才能调用super.onCreate()超类上的方法。请将promptsView的初始化推迟到调用super.onCreate()之后。

答案 1 :(得分:0)

View view = inflater.inflate(R.layout.fragment_name, container, false);
view.getContext();

在需要片段的应用程序上下文中使用view.getContext()