Eclipse调试Android应用程序 - 调试器显示错误的行执行

时间:2013-03-24 22:13:47

标签: android eclipse debugging dalvik

在我的应用程序中实现Twitter集成时,我发现了Eclipse调试器的以下奇怪之处。造成这种情况的原因是什么?

我正在使用这个AsyncTask通过twitter4j 3.0.3从twitter获取请求令牌。

    public class TwitterRequestAsync extends AsyncTask<Void, Void, RequestToken> {

        private Context context;

        public TwitterRequestAsync(Context context) {

            this.context = context;
        }

        @Override
        protected RequestToken doInBackground( Void... params ) {

            Twitter twitter = getTwitter();     // getTwitter() is in enclosing class
            try {
                RequestToken token = twitter.getOAuthRequestToken();
                return token;
            }
            catch (TwitterException e) {
                Log.e( TAG, e.getMessage(), e );
                return null;
            }
        }

        @Override
        protected void onPostExecute( RequestToken result ) {

            super.onPostExecute( result );
            if ( result != null ) {
                // stuffs concerning request token here
            }
        }

    }

当我调试此代码时,似乎在执行getOAuthRequestToken()时抛出了异常,并且调试器显示执行的下一行是在catch子句中,返回null;

但是,返回onPostExecute(...)的结果是一个有效的请求令牌,因此调试器正在做一些奇怪的事情。我已经多次清理了我的项目并重新启动了Eclipse,没有改变这种行为。我坏了吗?

2 个答案:

答案 0 :(得分:1)

这是一个已知问题。看起来它可能是Dalvik VM的一个问题。显示该方法的最后一个return语句在调试器中执行。

将doInBackground正文更改为:

        @Override
        protected RequestToken doInBackground( Void... params ) {

            Twitter twitter = getTwitter();
            RequestToken token = null;
            try {
                token = twitter.getOAuthRequestToken();
            }
            catch (TwitterException e) {
                Log.e( TAG, e.getMessage(), e );
            }
            return token;
        }

导致执行似乎按预期进行。

请参阅https://groups.google.com/forum/?fromgroups=#!topic/android-developers/DEU6JmdyFyM以获取有关此问题的旧提及,并提供更老的提及链接。有人最终在https://code.google.com/p/android/issues/detail?id=34193创建了一个问题。

答案 1 :(得分:1)

正如您的自我回答所说,这是一个已知问题。我想指出它(以及其他怪癖)记录在Dalvik文档中。您可以在official but raw表单中找到它,或unofficial but formatted - 跳到“已知问题和限制”。

如果文档更加突出,那就太好了。