startActivity(intent)的NullPointerException

时间:2012-10-26 18:33:34

标签: android nullpointerexception

对于我的生活,我似乎无法找出我的代码有什么问题。

AgrUserLoginHome.java
        public void onClick(View v) 
         {
     if(v.getId()==R.id.btnSubmitLogin)
       {
    String username=txtUsername.getText().toString();
    String password=txtPassword.getText().toString();
    //this is passed to be used in next LoginClientServiceThread class
    LoginClientServiceThread verifyLog = new  
            LoginClientServiceThread(this,username,password);
        verifyLog.run();

         }
    }

LoginClientServiceThread.java

    public class LoginClientServiceThread extends Activity implements Runnable{

private Intent intent;
private String username,password;
private Context context;
public LoginClientServiceThread(Context cont,String user,String pass)
{
    username=user;
    password=pass;
    context=cont;
}
public void run() {
    try
    {
        try
        {
            JSONObject json = new JSONObject();
            json.put("username", username);
            json.put("password", password);

            DefaultHttpClient httpClient = new DefaultHttpClient();
            URI uri = new URI("http://10.0.2.2:80/BairyApp/Login.svc");

            HttpPost httppost = new HttpPost(uri + "/verifyLogin");
            httppost.setHeader("Accept", "application/json");
            httppost.setHeader("Content-type", "application/json; charset=utf-8");

            HttpResponse response = httpClient.execute(httppost);
            HttpEntity responseEntity = response.getEntity();

            long intCount = responseEntity.getContentLength();
            char[] buffer = new char[(int)intCount];
            InputStream stream = responseEntity.getContent();
            InputStreamReader reader = new InputStreamReader(stream, "UTF-8");

            try
            {
                reader.read(buffer);
                String str = new String(buffer);
                intent=new Intent(context,TrainerAccessScreen.class);
                intent.putExtra("reading",str);
                if(null!=intent)
                {
                    Toast.makeText(context, "Working",  
                            Toast.LENGTH_LONG).show();
                            //startActivity shows as null here
                    startActivity(intent);
                }
                Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
            }
            catch (IOException e)
            {
                e.printStackTrace();
                Toast.makeText(context, "IOException:"+e.getMessage(),  
                    Toast.LENGTH_LONG).show();
               }
               finally
            {
                stream.close();
            }

        }
        catch(URISyntaxException urise)
        {
            urise.printStackTrace();
            Toast.makeText(context, "urise", Toast.LENGTH_LONG).show();
        }
        catch(ClientProtocolException cpe)
        {
            cpe.printStackTrace();
            Toast.makeText(context, "cpe", Toast.LENGTH_LONG).show();
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
            Toast.makeText(context, "ioe", Toast.LENGTH_LONG).show();
        }
    }
    catch(Exception e)
    {
        Toast.makeText(context, "Execution failed: "+e.getMessage(), 
                     Toast.LENGTH_SHORT).show();
        e.printStackTrace();
    }
   }
   }

我确定startActivity方法返回null。我知道这是因为如果我将intent上下文更改为“this”,则直接位于其下方的IOException中的Toast不会显示。

有什么想法吗?哦顺便说一下,我是初学者,所以我知道代码看起来很糟糕

logcat的

10-26 20:28:48.756: I/dalvikvm(1133): Jit: resizing JitTable from 512 to 1024
10-26 20:41:57.906: W/System.err(1169): java.lang.NullPointerException
10-26 20:41:57.906: W/System.err(1169):     at android.app.Activity.startActivityForResult(Activity.java:2827)
10-26 20:41:57.906: W/System.err(1169):     at android.app.Activity.startActivity(Activity.java:2933)
10-26 20:41:57.916: W/System.err(1169):     at agr.mobile.service.LoginClientServiceThread.run(LoginClientServiceThread.java:76)
10-26 20:41:57.916: W/System.err(1169):     at agr.mobile.app.AgrUserLoginHome.onClick(AgrUserLoginHome.java:59)
10-26 20:41:57.916: W/System.err(1169):     at android.view.View.performClick(View.java:2485)
10-26 20:41:57.916: W/System.err(1169):     at android.view.View$PerformClick.run(View.java:9080)
10-26 20:41:57.916: W/System.err(1169):     at android.os.Handler.handleCallback(Handler.java:587)
10-26 20:41:57.916: W/System.err(1169):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-26 20:41:57.916: W/System.err(1169):     at android.os.Looper.loop(Looper.java:123)
10-26 20:41:57.916: W/System.err(1169):     at android.app.ActivityThread.main(ActivityThread.java:3683)
10-26 20:41:57.916: W/System.err(1169):     at java.lang.reflect.Method.invokeNative(Native Method)
10-26 20:41:57.916: W/System.err(1169):     at java.lang.reflect.Method.invoke(Method.java:507)
10-26 20:41:57.916: W/System.err(1169):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-26 20:41:57.926: W/System.err(1169):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-26 20:41:57.926: W/System.err(1169):     at dalvik.system.NativeStart.main(Native Method)

1 个答案:

答案 0 :(得分:4)

您说LoginClientServiceThread不是Activity,但您延伸Activity。不要这样做。如果要从非活动类启动Activity,请使用以下命令:

intent=new Intent(context,TrainerAccessScreen.class);
intent.putExtra("reading",str);
if(null!=intent)
{
    Toast.makeText(context, "Working",  
    Toast.LENGTH_LONG).show();
    context.startActivity(intent);
}

当您从NullPointerException startActivity()实例调用this时,您收到了LoginClientServiceThread。但是,由于您尚未启动并将该Activity创建为普通活动,因此您具有空引用。所以你的最终代码如下:

public class LoginClientServiceThread implements Runnable{

    private Intent intent;
    private String username,password;
    private Context context;
    public LoginClientServiceThread(Context cont,String user,String pass)
    {
        username=user;
        password=pass;
        context=cont;
    }

    public void run() {
        try
        {
            try
            {
                JSONObject json = new JSONObject();
                json.put("username", username);
                json.put("password", password);

                DefaultHttpClient httpClient = new DefaultHttpClient();
                URI uri = new URI("http://10.0.2.2:80/BairyApp/Login.svc");

                HttpPost httppost = new HttpPost(uri + "/verifyLogin");
                httppost.setHeader("Accept", "application/json");
                httppost.setHeader("Content-type", "application/json; charset=utf-8");

                HttpResponse response = httpClient.execute(httppost);
                HttpEntity responseEntity = response.getEntity();

                long intCount = responseEntity.getContentLength();
                char[] buffer = new char[(int)intCount];
                InputStream stream = responseEntity.getContent();
                InputStreamReader reader = new InputStreamReader(stream, "UTF-8");

                try
                {
                    reader.read(buffer);
                    String str = new String(buffer);
                    intent=new Intent(context,TrainerAccessScreen.class);
                    intent.putExtra("reading",str);
                    if(null!=intent)
                    {
                        Toast.makeText(context, "Working",  
                            Toast.LENGTH_LONG).show();
                        //startActivity shows as null here
                        context.startActivity(intent);
                    }
                    Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                    Toast.makeText(context, "IOException:"+e.getMessage(),  
                        Toast.LENGTH_LONG).show();
                }
                finally
                {
                    stream.close();
                }

            }
            catch(URISyntaxException urise)
            {
                urise.printStackTrace();
                Toast.makeText(context, "urise", Toast.LENGTH_LONG).show();
            }
            catch(ClientProtocolException cpe)
            {
                cpe.printStackTrace();
                Toast.makeText(context, "cpe", Toast.LENGTH_LONG).show();
            }
            catch(IOException ioe)
            {
                ioe.printStackTrace();
                Toast.makeText(context, "ioe", Toast.LENGTH_LONG).show();
            }
        }
        catch(Exception e)
        {
            Toast.makeText(context, "Execution failed: "+e.getMessage(), 
                Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    }
}

您不需要在第二节课中扩展Activity