如何调试NullPointerException

时间:2013-06-10 11:15:34

标签: android nullpointerexception bundle android-dialog

我正在使用osm数据处理地图应用程序。我能够显示一个地图,然后在用户使用OSMR设置的两个点之间获得路线。直到这一点,我的应用程序运行正常。我现在添加代码以从另一个活动传递bundle,然后使用此bundle中传递的数据来计算并显示自定义对话框。传递数据的代码如下:

    tourist_taxi = (Button) findViewById(R.id.btn_tourist);
    normal_taxi = (Button) findViewById(R.id.btn_normal);

    tourist_taxi.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent i = new Intent(MenuActivity.this, MapActivity.class);
            Bundle bundle = new Bundle();
            bundle.putString("taxi_type", "normal");
            bundle.putDouble("rateperkm", 32.00);
            bundle.putDouble("waiting", 6.40);
            i.putExtras(bundle);
            startActivity(i);

        }
    });

    normal_taxi.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent i = new Intent(MenuActivity.this, MapActivity.class);
            Bundle bundle = new Bundle();
            bundle.putString("taxi_type", "tourist");
            bundle.putDouble("rateperkm", 438.00);
            bundle.putDouble("waiting", 63.00);
            bundle.putDouble("maxrate", 1026.00);
            i.putExtras(bundle);
            startActivity(i);

        }
    });

以及进行计算和显示对话框的方法如下

private void calculateFare(Road road) {

        if (road == null)
            return;

        Bundle bundle = getIntent().getExtras();
        double rateperkm = bundle.getDouble("rateperkm");
        double waitingcharge = bundle.getDouble("waiting");
        double maxrate = bundle.getDouble("maxrate");
        String taxi_type = bundle.getString("taxi_type");

        if (taxi_type.equals("normal")){
            rv = "Rs " + rateperkm + " per Kilometer and Rs " + waitingcharge
                    + " per 2 min waiting";
        }
        if (taxi_type.equals("tourist")){
            rv = "Rs " + rateperkm + " for 5 Km and Rs " + waitingcharge
                    + " for additional km, Rs " + maxrate + "maximum";
        }
        final Dialog d = new Dialog(this, R.style.CustomDialogTheme);
        d.setContentView(R.layout.fare_popup);

        if (road.mStatus == Road.STATUS_DEFAULT) {

            distance_value.setText("Could not get distance");
            rate_value.setText(rv);
            fare_value.setText("Could not calculate fare");
            d.show();           
            return;

        }

        dv = String.valueOf(road.mLength);
        if (taxi_type.equals("normal")){
        double fare = (road.mLength * rateperkm) + 10;
        fv = String.valueOf(fare);
        }
        if (taxi_type.equals("normal")){
            if (road.mLength < 5.00){
                fv = String.valueOf(rateperkm);
            }
            else{
                double fare = ((road.mLength-5)*waitingcharge + rateperkm);
                if (fare > maxrate){
                    fare = maxrate;
                }
                fv = String.valueOf(fare);              
            }
        }
        fare_value.setText(fv);
        distance_value.setText(dv);
        rate_value.setText(rv);
        d.show();

    }

在此之后我得到了NPE。由于我是一名新手程序员,我对NPE并不熟悉,并且从错误代码中我无法跟踪错误的来源。这是我的错误代码。

06-10 09:46:53.237: W/dalvikvm(384): threadid=1: thread exiting with uncaught exception (group=0x40014760)
06-10 09:46:53.257: E/AndroidRuntime(384): FATAL EXCEPTION: main
06-10 09:46:53.257: E/AndroidRuntime(384): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.nirab.merobhadameter/com.nirab.merobhadameter.MapActivity}: java.lang.NullPointerException
06-10 09:46:53.257: E/AndroidRuntime(384):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1672)
06-10 09:46:53.257: E/AndroidRuntime(384):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764)
06-10 09:46:53.257: E/AndroidRuntime(384):  at android.app.ActivityThread.access$1500(ActivityThread.java:122)
06-10 09:46:53.257: E/AndroidRuntime(384):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002)
06-10 09:46:53.257: E/AndroidRuntime(384):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-10 09:46:53.257: E/AndroidRuntime(384):  at android.os.Looper.loop(Looper.java:132)
06-10 09:46:53.257: E/AndroidRuntime(384):  at android.app.ActivityThread.main(ActivityThread.java:4025)
06-10 09:46:53.257: E/AndroidRuntime(384):  at java.lang.reflect.Method.invokeNative(Native Method)
06-10 09:46:53.257: E/AndroidRuntime(384):  at java.lang.reflect.Method.invoke(Method.java:491)
06-10 09:46:53.257: E/AndroidRuntime(384):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
06-10 09:46:53.257: E/AndroidRuntime(384):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
06-10 09:46:53.257: E/AndroidRuntime(384):  at dalvik.system.NativeStart.main(Native Method)
06-10 09:46:53.257: E/AndroidRuntime(384): Caused by: java.lang.NullPointerException
06-10 09:46:53.257: E/AndroidRuntime(384):  at android.app.Activity.findViewById(Activity.java:1744)
06-10 09:46:53.257: E/AndroidRuntime(384):  at com.nirab.merobhadameter.MapActivity.<init>(MapActivity.java:65)
06-10 09:46:53.257: E/AndroidRuntime(384):  at java.lang.Class.newInstanceImpl(Native Method)
06-10 09:46:53.257: E/AndroidRuntime(384):  at java.lang.Class.newInstance(Class.java:1301)
06-10 09:46:53.257: E/AndroidRuntime(384):  at android.app.Instrumentation.newActivity(Instrumentation.java:1022)
06-10 09:46:53.257: E/AndroidRuntime(384):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1663)
06-10 09:46:53.257: E/AndroidRuntime(384):  ... 11 more

很高兴知道如何解决这种情况并采取正确的方法。提前致谢。

编辑: 问题是我试图在不执行setContentView的情况下访问TextView元素。这是我更新的calculateFare方法代码。

private void calculateFare(Road road) {

    if (road == null)
        return;

    final Dialog d = new Dialog(this, R.style.CustomDialogTheme);
    d.setContentView(R.layout.fare_popup);

    TextView fare_value = (TextView) findViewById(R.id.fare_value);
    TextView rate_value = (TextView) findViewById(R.id.rate_value);
    TextView distance_value = (TextView) findViewById(R.id.distance_value);
    String fv = "0.00" , rv="0.00" , dv="0.00";

    Bundle bundle = getIntent().getExtras();
    double rateperkm = bundle.getDouble("rateperkm");
    double waitingcharge = bundle.getDouble("waiting");
    double maxrate = bundle.getDouble("maxrate");
    String taxi_type = bundle.getString("taxi_type");

    if (taxi_type.equals("normal")){
        rv = "Rs " + rateperkm + " per Kilometer and Rs " + waitingcharge
                + " per 2 min waiting";
    }
    if (taxi_type.equals("tourist")){
        rv = "Rs " + rateperkm + " for 5 Km and Rs " + waitingcharge
                + " for additional km, Rs " + maxrate + "maximum";
    }


    if (road.mStatus == Road.STATUS_DEFAULT) {

        distance_value.setText("Could not get distance");
        rate_value.setText(rv);
        fare_value.setText("Could not calculate fare");
        d.show();           
        return;

    }

    dv = String.valueOf(road.mLength);
    if (taxi_type.equals("normal")){
    double fare = (road.mLength * rateperkm) + 10;
    fv = String.valueOf(fare);
    }
    if (taxi_type.equals("normal")){
        if (road.mLength < 5.00){
            fv = String.valueOf(rateperkm);
        }
        else{
            double fare = ((road.mLength-5)*waitingcharge + rateperkm);
            if (fare > maxrate){
                fare = maxrate;
            }
            fv = String.valueOf(fare);              
        }
    }

    fare_value.setText(fv);
    distance_value.setText(dv);
    rate_value.setText(rv);
    d.show();

}

现在我在fare_value.setText(fv);行获得了一个NPE。

0 个答案:

没有答案