异步任务的空指针异常

Posted

技术标签:

【中文标题】异步任务的空指针异常【英文标题】:Null pointer exception for async task 【发布时间】:2011-09-24 05:54:42 【问题描述】:

我正在处理我的网络服务,我遇到了一个奇怪的问题,我无法解决这个问题,因为我是 android 开发的新手。在异步任务的onPostExecute() 方法中显示吐司时出现空指针异常。请有人帮我解决这个问题

if (result.booleanValue()) // here at this line I am getting the error in logcat//

提前谢谢....!

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ///////////male female buttons code/////////////
    Button regmalebtn = (Button) findViewById(R.id.regmalebtn); 
    regmalebtn.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v) 
            // TODO Auto-generated method stub
            gender="M";
            System.out.println("gender value after  male button click ="+gender);
            Log.v(TAG,"gender value on  male button click ="+gender );
        
    );
    Button regfemalebtn = (Button)findViewById(R.id.regfemalebtn);
    regfemalebtn.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v) 
            // TODO Auto-generated method stub
            gender ="F";
            // System.out.println("gender value on  female button click ="+gender);
            Log.v(TAG,"gender value on  female button click ="+gender );
        
    );

    ////////////male female button code will ends here/////////////

    Button signin = (Button) findViewById(R.id.regsubmitbtn);
    signin.setOnClickListener(new OnClickListener() 
        public void onClick(View v) 
            new RegisterTask().execute();
        ;
    );



private class RegisterTask extends AsyncTask<Void, Void, Boolean> 
    private final ProgressDialog dialog = new ProgressDialog(Register.this);

    protected void onPreExecute() 
        this.dialog.setMessage("Registering...");
        this.dialog.show();
    


    //  @SuppressWarnings("unused")
    protected Boolean doInBackground(final Void unused) 
        return this.register(); //don't interact with the ui!
    

    private Boolean register() 
        ************some code for webservices************
    

    return null;



protected void onPostExecute(final Boolean result) 
    if (this.dialog.isShowing()) 
        this.dialog.dismiss();
    
    if (result.booleanValue()) 
        // show register success dialog
        // I m getting the error at above line

        Toast.makeText(Register.this, "Registerd", Toast.LENGTH_SHORT).show();
    
    else 
        Toast.makeText(Register.this, "Try Again", Toast.LENGTH_SHORT).show();
    


@Override
protected Boolean doInBackground(Void... params) 
    // TODO Auto-generated method stub
    return register();



   

这些是 logcat 错误

06-28 16:55:56.685: WARN/dalvikvm(708): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
06-28 16:55:56.695: ERROR/AndroidRuntime(708): FATAL EXCEPTION: main
06-28 16:55:56.695: ERROR/AndroidRuntime(708): java.lang.NullPointerException
06-28 16:55:56.695: ERROR/AndroidRuntime(708):     at com.soap.Register$RegisterTask.onPostExecute(Register.java:193)
06-28 16:55:56.695: ERROR/AndroidRuntime(708):     at com.soap.Register$RegisterTask.onPostExecute(Register.java:1)
06-28 16:55:56.695: ERROR/AndroidRuntime(708):     at android.os.AsyncTask.finish(AsyncTask.java:417)
06-28 16:55:56.695: ERROR/AndroidRuntime(708):     at android.os.AsyncTask.access$300(AsyncTask.java:127)
06-28 16:55:56.695: ERROR/AndroidRuntime(708):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
06-28 16:55:56.695: ERROR/AndroidRuntime(708):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-28 16:55:56.695: ERROR/AndroidRuntime(708):     at android.os.Looper.loop(Looper.java:123)
06-28 16:55:56.695: ERROR/AndroidRuntime(708):     at android.app.ActivityThread.main(ActivityThread.java:4627)

【问题讨论】:

xoriant.com/blog/mobile-application-development/… 如何在调用result.booleanValue()之前做空检查? 我尝试了以下建议,但它只显示进度对话框作为输出,没有别的 【参考方案1】:

尝试使用您的activity.class 的名称作为Toa​​st 的参数。我认为在你的情况下是 Register.class 而不是 Register.this

【讨论】:

如果我使用 register.class,我会遇到类似 Toast 类型中的方法 makeText(Context, CharSequence, int) 不适用于参数 (Class, String, int) 这个答案不正确。见:developer.android.com/reference/android/widget/…, java.lang.CharSequence, int)【参考方案2】:

您显然是从 register 方法返回 null 。在调用 result.booleanValue() 之前返回非空值或进行空值检查。

你可以这样做:

if (result == null) 


else if (result.booleanValue()) 


else 


对了,为什么需要返回一个布尔值而不是布尔值(原始类型,不能为空)。

【讨论】:

感谢您的回复,但您能帮我解决一下代码 sn-p,我有点困惑 如何在调用result.booleanValue()之前做空检查? 再次感谢,我想检查 logcat 的结果,如果它是 1,那么我应该显示像“REGISTERD”这样的祝酒词或警报,否则为“TRYAGAIN” 我试过了,但只有进度对话框显示,什么也没有,几分钟后强制关闭【参考方案3】:

尝试将上下文传递给变量。或尝试Register.this.getApplicationContext()BaseContext。检查对话框是否为空,传递值并在postExecute() 中创建新对话框,如果这与您的要求不重叠:)

【讨论】:

谢谢,但是如何检查空值以免返回空值,有点困惑 @Raj Check like this if(dialog != null) do the rest of operation ;所以如果对话框为空,那么什么都不会发生。如果对话框不为空,则操作会定期进行。 谢谢,根据 logcat 响应,我得到了带有 toast 的 prblm。在每种情况下,如果 (resultsRequestSOAP == null) Toast.makeText(Register.this.getApplicationContext( ), "再试一次", Toast.LENGTH_SHORT).show(); else if (resultsRequestSOAP.booleanValue()) //也显示注册成功对话框 Toast.makeText(Register.this.getApplicationContext(), "Registerd", Toast.LENGTH_SHORT).show(); else Toast.makeText(Register.this.getBaseContext(), "字段为空", Toast.LENGTH_SHORT).show(); 【参考方案4】:

我写了这个

protected void onPostExecute(String unused) 
            dismissDialog(DIALOG_DOWNLOAD_PROGRESS);

            Toast.makeText(
                    myclassname.this,
                    "Downloading of " + FILENAME
                            + " complete.", Toast.LENGTH_LONG).show();
            refreshList();


        

这对我有用..

see this link for more detailhttp://hi.baidu.com/hi_android/blog/item/fea149f90da7fdedfd037f56.htmlhttp://www.screaming-penguin.com/node/7746

【讨论】:

@Pragana,谢谢,根据 logcat 响应,我得到了带有 toast 的 prblm。在每种情况下,如果 (resultsRequestSOAP == null) Toast.makeText(Register.this .getApplicationContext(), "再试一次", Toast.LENGTH_SHORT).show(); else if (resultsRequestSOAP.booleanValue()) //也显示注册成功对话框 Toast.makeText(Register.this.getApplicationContext(), "Registerd", Toast.LENGTH_SHORT).show(); else Toast.makeText(Register.this.getBaseContext(), "字段为空", Toast.LENGTH_SHORT).show(); 【参考方案5】:

通过像这样启动 Toast,我摆脱了同样的 Toast/Async/Nullpointe 问题:

Toast.makeText(getApplicationContext(), "Hello Toast!", Toast.LENGTH_SHORT).show();

【讨论】:

以上是关于异步任务的空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

RestEasy 异步请求中的空指针异常

记录一些遇见的bug——记录一个使用多线程异步调用openfeign时子线程丢失request请求头导致的空指针异常错误

JAXB RI ClassFactory 中的空指针异常

java中的空指针异常怎么解决

c++异步回调函数引用传递空指针异常

getGraphics() 上的空指针异常