开发者

Null Pointer Exception in android when switching activities

I just started programming for Android when my boss asked me to make him a mobile app so I completed all of this in two days and taught myself as I was doing it, mostly from this site. I keep getting a nullPointerException when i run my program and click on the button that switches the the next activity

First activity:

package com.Android.HelpDeskMobileApp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class HelpDeskFront extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first);
        Button serviceButton = (Button)findViewById(R.id.serviceButton),
                orderButton = (Button)findViewById(R.id.OrderButton),
                programmingButton = (Button)findViewById(R.id.ProgrammingButton);
        serviceButton.setOnClickListener(buttonListener);
        orderButton.setOnClickListener(buttonListener);
        programmingButton.setOnClickListener(buttonListener);
    }
    private OnClickListener buttonListener = new OnClickListener() {

        public void onClick(View v) {
            String serviceType = null;
            Intent i = new Intent(HelpDeskFront.this, Main.class);
            if (v.getId() == R.id.serviceButton)
                serviceType = "service";
            else if (v.getId() == R.id.OrderButton)
                serviceType = "order";
            else if (v.getId() == R.id.ProgrammingButton)
                serviceType = "programming";
            i.putExtra("serviceType", serviceType);
            startActivityForResult(i, Intent.FILL_IN_DATA);
        };
}

Buttons lead to my second activity:

package com.Android.HelpDeskMobileApp;

import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class Main extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final Button send = (Button)findViewById(R.id.sendRequest);
        send.setOnClickListener(buttonListener);
    }
    private OnClickListener buttonListener = new OnClickListener() {

        ArrayList<NameValuePair> data = new ArrayList<NameValuePair>(5);
        final EditText caller = (EditText) findViewById(R.id.CallerEnter), 
                 callExt = (EditText) findViewById(R.id.CallNumberEnter),
                 computerName = (EditText) findViewById(R.id.ComputerNameEnter),
                 location = (EditText) findViewById(R.id.LocationEnter),
                 request = (EditText) findViewById(R.id.RequestEnter);

        public void onClick(View v) {
                    Intent i = getIntent();
        final String serviceType = i.getStringExtra("serviceType");
            Intent intent = new Intent(Main.this, HelpDeskEnd.class);
            final String[] email = {"target emails"};
            data.add(new BasicNameValuePair("Caller: ", textToString(caller)));
            data.add(new BasicNameValuePair("Call Ext: ", textToString(callExt)));
            data.add(new BasicNameValuePair("Computer Name: ", textToString(computerName)));
            data.add(new BasicNameValuePair("Locations: ", textToString(location)));
            data.add(new BasicNameValuePair("Request: ", textToString(request)));
            sendData(data);

            String body = data.get(0).toString() + " " + data.get(1).toString() + " " +
                    data.get(2).toString() + " " + data.get(3).toString() + " " + 
                    data.get(4).toString();
            Mail mail = new Mail("an email", "email password");
            mail.setTo(email);
            mail.setBody(body);
            mail.setFrom("an email");
            mail.setSubject(serviceType);
            try {
                mail.send();
            }
            catch (Exception e) {
                 Log.e("Send Mail", e.getMessage(), e);
            }
            intent.putExtra("serivceType", serviceType);
            startActivity(intent);
        }

    };
    private String textToString(EditText x)
    {
        return x.getText().toString();
    }
    private void sendData(ArrayList<NameValuePair> data)
    {
        try {

            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost("https//www.awebsite.com/phpfile.php");
            httpPost.setEntity(new UrlEncodedFormEntity(data));
            HttpResponse response = httpclient.execute(httpPost);
            Log.i("postData", response.getStatusLine().toString());
        }
        catch (Exception e){
            Log.e("log_tag", "Error: " + e.toString());
        }
    }
}

This is probably some really easy fix. Thanks for any help. Here is my manifest file also I don't know if its helpful but here it is:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.Android.HelpDeskMobileApp"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="12" />
    <uses-permission android:name="android.permission.INTERNET" />

    <application android:icon="@drawable/logo" android:label="@string/app_name">
        <activity android:name=".HelpDeskFront"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:label="@string/app_name" 
                  android:name=".Main">
                  <intent-filter></intent-filter>
        </activity>
        <activity android:label="@string/app_name" 
                  android:name=".HelpDeskEnd">
                  <intent-filter></intent-filter>
        </activity>

    </application>
</manifest>

The error happens when I hit the button to go from the first activity to the .main activity. I have tried commenting out different parts of the code but I cannot figure out what is causing the Null Pointer Exception. Thanks. log cat:

    07-13 18:37:29.833: ERROR/AndroidRuntime(770): FATAL EXCEPTION: main
07-13 18:37:29.833: ERROR/AndroidRuntime(770): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.Android.HelpDeskMobileApp/com.Android.HelpDeskMobileApp.Main}: java.lang.NullPointerException
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1672)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1764)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.ActivityThread.access$1500(ActivityThread.java:122)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1002)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.os.Looper.loop(Looper.java:132)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.ActivityThread.main(ActivityThread.java:4025)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at java.lang.reflect.Method.invokeNative(Native Method)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at java.lang.reflect.Method.invoke(Method.java:491)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at dalvik.system.NativeStart.main(Native Method)
07-13 18:37:29.833: ERROR/AndroidRuntime(770): Ca开发者_JS百科used by: java.lang.NullPointerException
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.Activity.findViewById(Activity.java:1744)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at com.Android.HelpDeskMobileApp.Main$1.<init>(Main.java:35)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at com.Android.HelpDeskMobileApp.Main.<init>(Main.java:31)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at java.lang.Class.newInstanceImpl(Native Method)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at java.lang.Class.newInstance(Class.java:1301)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.Instrumentation.newActivity(Instrumentation.java:1022)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1663)
07-13 18:37:29.833: ERROR/AndroidRuntime(770):     ... 11 more


It's line 34 in Main. The lines under "Caused by" in the logcat output are where the relevant info usually is.

Okay, culprit should be the initializers

Intent i = getIntent();
        final String serviceType = i.getStringExtra("serviceType");
        final EditText caller = (EditText) findViewById(R.id.CallerEnter), 
            callExt = (EditText) findViewById(R.id.CallNumberEnter),
            computerName = (EditText) findViewById(R.id.ComputerNameEnter),
            location = (EditText) findViewById(R.id.LocationEnter),
            request = (EditText) findViewById(R.id.RequestEnter);

occurring in the Object constructor. Since the onClickListener constructor will run before the onCreate() method, getIntent() will return null, and you will not have set your contentView so all your findViewById()'s will also return null.

The correct way would be:

private OnClickListener buttonListener = new OnClickListener() {

        ArrayList<NameValuePair> data = new ArrayList<NameValuePair>(5);

        public void onClick(View v) {
                    Intent i = getIntent();
        final String serviceType = i.getStringExtra("serviceType");
        final EditText caller = (EditText) findViewById(R.id.CallerEnter), 
            callExt = (EditText) findViewById(R.id.CallNumberEnter),
            computerName = (EditText) findViewById(R.id.ComputerNameEnter),
            location = (EditText) findViewById(R.id.LocationEnter),
            request = (EditText) findViewById(R.id.RequestEnter);

            Intent intent = new Intent(Main.this, HelpDeskEnd.class);
            final String[] email = {"target emails"};
            data.add(new BasicNameValuePair("Caller: ", textToString(caller)));
            data.add(new BasicNameValuePair("Call Ext: ", textToString(callExt)));
            data.add(new BasicNameValuePair("Computer Name: ", textToString(computerName)));
            data.add(new BasicNameValuePair("Locations: ", textToString(location)));
            data.add(new BasicNameValuePair("Request: ", textToString(request)));
            sendData(data);

            String body = data.get(0).toString() + " " + data.get(1).toString() + " " +
                    data.get(2).toString() + " " + data.get(3).toString() + " " + 
                    data.get(4).toString();
            Mail mail = new Mail("an email", "email password");
            mail.setTo(email);
            mail.setBody(body);
            mail.setFrom("an email");
            mail.setSubject(serviceType);
            try {
                mail.send();
            }
            catch (Exception e) {
                 Log.e("Send Mail", e.getMessage(), e);
            }
            intent.putExtra("serivceType", serviceType);
            startActivity(intent);
        }

    };


Does HelpDeskFront.startActivity(intent); solve the problem?


private OnClickListener buttonListener = new OnClickListener() {

    public void onClick(View v) {
        String serviceType = null;
        Intent i = new Intent(HelpDeskFront.this, Main.class);
        switch (v.getId()) {
        case R.id.serviceButton :
            serviceType = "service";
            break;
        case R.id.OrderButton :
            serviceType = "order";
            break;
        case R.id.ProgrammingButton :
            serviceType = "programming";
            break;
        }
        i.putExtra("serviceType", serviceType);
        startActivity(i);// change this to startActivityForResult(yourintent,Intent.FILL_IN_DATA)
    }
};

Just a thought at first glance


Try to use if(view==programmingButton)else if(view==another button) like this instead of switch,can you post the logcat and tell which code(as part of onclick listener or second activity) to null pointer exception...


The error is on line 34

final String serviceType = i.getStringExtra("serviceType");

which means that "i" is probably not initialized properly.

I would try this so that the contexts are right.

Intent i = Main.this.getIntent();

Or you could just create a new intent like you did in the other activity.


You have a lot of issues with how your app is even starting off in its main activity!

You need to set the listeners in the onStart() method not in the onCreate() method. onCreate() isn't always called every time the activity is shown.

You don't need to find out what button has been clicked using a switch, if/else, or anything so complex... each button has its own onClickListener(). In the listener call a private method to start the new activity.

Pass whatever data you want through the intent using putExtra().

Here is an example...

public class MainActivity extends Activity {

    @Override
    public void onCreate( final Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState );
        this.setContentView( R.layout.main );
    }

    @Override
    protected void onStart() {
        super.onStart();

        final Button _serviceButton = (Button)this.findViewById( R.id.buttonService );
        final Button _orderButton = (Button)this.findViewById( R.id.buttonOrder );
        final Button _progButton = (Button)this.findViewById( R.id.buttonProgramming );

        _serviceButton.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick( final View v ) {
                MainActivity.this.doSomeButtonClick( "service" );
            }
        } );

        _orderButton.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick( final View v ) {
                MainActivity.this.doSomeButtonClick( "order" );
            }
        } );

        _progButton.setOnClickListener( new OnClickListener() {

            @Override
            public void onClick( final View v ) {
                MainActivity.this.doSomeButtonClick( "programming" );
            }
        } );
    }

    private void doSomeButtonClick( final String type ) {
        final Intent intent = new Intent( MainActivity.this, Activity1.class );
        intent.putExtra( "serviceType", type );
        this.startActivity( intent );
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜