This question already has answers here:
What is a NullPointerException, and how do I fix it?
                                
                                    (12个答案)
                                
                        
                4年前关闭。
            
        

我正在尝试改编两个教程,以学习Volley。

显示进度对话框时出现错误。

这是我的代码:

public class MainActivity extends Activity {

    final static String MARS_WEATHER_RECENT = "http://marsweather.ingenology.com/v1/latest/";
    private static String TAG = MainActivity.class.getSimpleName();

    // Progress dialog
    private ProgressDialog pDialog;

    private TextView debug_container;
    private TextView degrees;

    // temporary string to show the parsed response
    private String jsonResponse;

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

        debug_container = (TextView) findViewById(R.id.debug_container);
        degrees = (TextView) findViewById(R.id.degrees);

        loadMarsWeatherData();

        pDialog = new ProgressDialog(this);
        pDialog.setMessage("Please wait...");
        pDialog.setCancelable(false);

    }

    private void loadMarsWeatherData() {

        showpDialog();
        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
                MARS_WEATHER_RECENT, (String)null, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                Log.d(TAG, response.toString());

                try {
                    // Parsing json object response
                    // response will be a json object
                    response = response.getJSONObject("report");
                    String min_degree = response.getString("min_temp");

                    degrees.setText(min_degree);

                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(),
                            "Error: " + e.getMessage(),
                            Toast.LENGTH_LONG).show();
                }
                hidepDialog();
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
                Toast.makeText(getApplicationContext(),
                        error.getMessage(), Toast.LENGTH_SHORT).show();
                // hide the progress dialog
                hidepDialog();
            }
        });

        // Adding request to request queue
        AppController.getInstance().addToRequestQueue(jsonObjReq);
    }





    private void showpDialog() {
        if (!pDialog.isShowing())
            pDialog.show();
    }

    private void hidepDialog() {
        if (pDialog.isShowing())
            pDialog.dismiss();
    }
}


错误是

    [...]
    FATAL EXCEPTION: main
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.webtemplum.crazyweather/com.webtemplum.crazyweather.MainActivity}: java.lang.NullPointerException
[...]
used by: java.lang.NullPointerException
            at com.webtemplum.crazyweather.MainActivity.showpDialog(MainActivity.java:222)
            at com.webtemplum.crazyweather.MainActivity.loadMarsWeatherData(MainActivity.java:56)
            at com.webtemplum.crazyweather.MainActivity.onCreate(MainActivity.java:46)


(删除了一些错误行,如果我理解正确,那么错误在showpDialog中)。

当然,如果我发表评论,showpDialog应用程序将运行。

如果我注释loadWeatherData中的所有块并仅保留,则发生相同的事情(应用运行)

private void loadMarsWeatherData() {

        showpDialog();
        hidepDialog();
}


非常感谢你。

最佳答案

看一下这段代码:

loadMarsWeatherData();

pDialog = new ProgressDialog(this);
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);


您正在实例化loadMarsWeatherData之前调用pDialog。但是,在loadMarsWeatherData中,您正在调用pDialog

showpDialog();


将会通知:

private void showpDialog() {
    if (!pDialog.isShowing())
        pDialog.show();
}


您需要更改顺序-首先实例化pDialog,然后调用该方法:

pDialog = new ProgressDialog(this);
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);

loadMarsWeatherData();

07-24 18:57