Приложение за Android за отстраняване на грешки на Eclipse - програмата за отстраняване на грешки показва изпълнение на грешен ред

Докато прилагах интеграция на Twitter в моето приложение, открих следната странност на дебъгера на Eclipse. На какво се дължи това?

Използвам тази AsyncTask за получаване на токен на заявка от twitter с помощта на twitter4j 3.0.3.

    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, return null;

Въпреки това, резултатът, който се връща към onPostExecute(...) е валиден токен на заявка, така че дебъгерът прави нещо странно. Почистих проекта си и рестартирах Eclipse всеки няколко пъти без промяна в това поведение. Счупен ли съм?


person dm78    schedule 24.03.2013    source източник


Отговори (2)


Това е известен проблем. Изглежда, че може да е проблем с Dalvik VM. Последният оператор за връщане на метода е показан за изпълнение в програмата за отстраняване на грешки.

Промяна на тялото на 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.

person dm78    schedule 24.03.2013

Както отбелязва вашият самостоятелен отговор, това е известен проблем. Исках да отбележа, че това (и други странности) са документирани в документите на Dalvik. Можете да го намерите в официален, но необработен вид, или неофициален, но форматиран - прескочете надолу до „Известни проблеми и Ограничения“.

Би било хубаво, ако документацията беше по-видна.

person fadden    schedule 25.03.2013
comment
Благодаря за свързването на документите на Dalvik! Не попаднах на това в моите търсения. Всъщност срещнах много малко относно това поведение при търсенето си, което е основната причина да го публикувам тук. - person dm78; 26.03.2013
comment
Dx конверторът въвежда някои странности, но всъщност прави всичко възможно, за да генерира код, който е по-нисък за производителност, но по-добър за отстраняване на грешки, ако смята, че може да прикачите програма за отстраняване на грешки по-късно. Вижте напр. публикацията ми в groups.google.com/forum/?fromgroups =#!topic/android-platform/ . IIRC, нещата с комбинирането на връщане бяха по-трудни за разкриване. - person fadden; 26.03.2013