2016-08-25 2 views
9

Я пытаюсь отследить источник ошибки, основанный на отчете о сбое, представленном пользователем, и пришел к выводу, что мне нужно некоторое базовое обучение тому, как интерпретировать отчет о сбое.Как читать отчеты о сбоях из консоли разработчика

В качестве примера, отчет аварии выглядит следующим образом:

java.lang.NumberFormatException: Invalid int: "" 
    at java.lang.Integer.invalidInt(Integer.java:138) 
    at java.lang.Integer.parseInt(Integer.java:358) 
    at java.lang.Integer.parseInt(Integer.java:334) 
    at java.lang.Integer.valueOf(Integer.java:525) 
    at com.cloud3squared.meteogram.MeteogramService.cacheFileName(MeteogramService.java) 
                cacheBaseName(MeteogramService.java) 
                getAppWidgetId(MeteogramService.java) 
                createAdhocWidgetUpdateIntent(MeteogramService.java) 
                setupBasicClickStuff(MeteogramService.java) 
                setAdhocAppWidgetAlarm(MeteogramService.java) 
                setNextClockWidgetUpdateAlarm(MeteogramService.java) 
                cancelAppWidgetAlarm(MeteogramService.java) 
                cancelAppWidgetAlarms(MeteogramService.java) 
                logAction$3aaf2084(MeteogramService.java) 
                logActionAgainstAllWidgets$62dc3a79(MeteogramService.java) 
                updateAppWidget(MeteogramService.java) 
                showButtons(MeteogramService.java) 
                hideButtons(MeteogramService.java) 
                fetchOk(MeteogramService.java) 
                getViewId(MeteogramService.java) 
                putBitmapIntoWidget(MeteogramService.java) 
                lngNow(MeteogramService.java) 
                showNotification(MeteogramService.java) 
                showMessageInWidget(MeteogramService.java) 
                sharpen(MeteogramService.java) 
                removeFromRequestsList(MeteogramService.java) 
                removeFromRequestsList$204347ff(MeteogramService.java) 
                      MeteogramService.java) 
                displayStuffInWidget(MeteogramService.java) 
                access$000(MeteogramService.java) 
                access$100(MeteogramService.java) 
                access$300(MeteogramService.java) 
    at com.cloud3squared.meteogram.MeteogramService$GetServerWidgetAsyncTask.onPostExecute(MeteogramService.java) 
    at android.os.AsyncTask.finish(AsyncTask.java:651) 
    at android.os.AsyncTask.access$500(AsyncTask.java:180) 
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:224) 
    at android.app.ActivityThread.main(ActivityThread.java:5526) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Это показывает порядок вызовов, ведущих к NumberFormatException, и если да, то в каком порядке? Я читаю строки at снизу вверх? Что такое access вложенный внутри MeteogramService? ... нет access способ в этом классе. Как определить, в какой функции на самом деле происходит NumberFormatException? Логически я бы сказал, что внутри cacheFileName, но там ничего нет, что может привести к такому исключению ... разбор String до int происходит до этого ... разобранный int просто передается в cacheFileName.

Любая помощь с благодарностью получена.

EDIT

Другие фрагменты кода для ссылки в комментариях ниже:

static String cacheFileName(Context context, int appWidgetId, int pxWidth, int pxHeight) { 
    String fileName = cacheBaseName(appWidgetId) + "_" + pxWidth + "x" + pxHeight + ".png"; 
    logAction(context, appWidgetId, "cacheFileName " + fileName, TAG); 
    return fileName; 
} 

static String cacheBaseName(int appWidgetId) { 
    return (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) ? "widget_" : "widget_" + appWidgetId; 
} 
+0

Да, стек исключений показывает порядок вызовов. Исключение составляет только верхняя часть (invalidInt).Я не слишком уверен в всех именах методов, перечисленных после cacheFileName, возможно, эксперт по Java может комментировать. Метод с нетерпением ждет того, который вызывается onPostExecute. Чтобы отлаживать, я бы просто вообще осмотрел MeteograomService.java для вызовов valueOf (String). Надеюсь, их не так уж много. Обязательно попробуйте/поймайте каждый –

+0

, он имеет отношение к вашему виджету, когда он обновлялся в вашем сервисе messagegram. – Elltz

+0

Используете ли вы ProGuard? – Zoe

ответ

3

Ошибка в MeteogramService.java файле.

Ошибка NumberFormatException связана с недопустимым значением int, которое возможно связано с передачей строки или недопустимой переменной в int.

Список имен классов или имен методов - это порядок сверху вниз, в котором была доступна переменная. Убедитесь, что вы передаете int, и в случае, если это пользовательское значение, используйте блок try/catch и show toast всякий раз, когда они вводят значение non-int.

2

Это показывает порядок вызовов, приведших к NumberFormatException

Да этот стек след определенно показывает вам порядок вызовов ведущих ДО исключения. Прочитайте трассировку стека снизу вверх, чтобы знать порядок вызовов методов -

Что доступ вложенной внутрь MeteogramService ... нет метода доступа к этому классу

эти методы доступа автоматически генерируемые методы для доступа к членам внешнего класса из внутреннего класса. Для более подробной информации проверьте это video Джейк Уортон.

Как определить, внутри которых функция NumberFormatException фактически происходит

Проверьте все вызовы методов в трассировке стека. Лучшие из них расскажут вам, из какого метода вызывается исключение. Поэтому, если вы проверяете трассировку стека, вызовы методов в строках 2-4 относятся к классу Integer.java, который является классом, не определенным вами, но исключение инициируется из этого класса. Теперь, если вы дойдете до строки 5, это ясно говорит вам, что следующий вызов метода - MeteogramService.cacheFileName().Таким образом, исключение возникло, когда вы пытаетесь сделать что-то из этого метода.

нет ничего там, что может привести к такому исключению

внимательно прочитай трассировки стека. В первой строке написано: java.lang.NumberFormatException: Invalid int: "". Это означает, что вы передаете пустую строку или «» в целочисленный класс. Теперь, если вы проверите строку до MeteogramService.cacheFileName(), вы ответите: java.lang.Integer.valueOf().

Отсюда вывод вы вызываете метод() valueOf, и пустая строка, которая не является допустимым Integer и, следовательно, NumberFormatException

+0

Я все еще смущен порядком, в котором список должен быть прочитан. Если это снизу вверх, то исключение должно происходить в 'cacheFileName()'. Но я добавил код для этой функции в свой вопрос, и в этой функции нет ссылки на 'Integer.valueOf()' ... даже в 'cacheBaseName()', вызываемом этой функцией. Единственные вызовы 'Integer.valueOf()' находятся в 'showNotification()' и 'removeFromRequestsList()', которые намного дальше по списку. Итак, снова, каков правильный способ прочитать заказ? – drmrbrewer

+0

Как насчет кода, который вызывает методы? – Zoe

+0

@ Polarbear0106 какие методы? –

3

Вы должны прочитать его ОБА из сверху вниз и снизу вверх.

Это, как правило, более конкретный от верхнего до более широкого в нижней части.

Из TOP вы найдете точную причину исключения

Что в данном случае является java.lang.NumberFormatException, который взрывается при cacheFileName «s cacheBaseName

С НИЖНЕЙ вы найдете общая площадь проблемы

GetServerWidgetAsyncTask.onPostExecute

Мне кажется, что это может быть какое-то значение в фоновом режиме в AsyncTask неправильно отформатировано и используется как int в onPostExecute.

Где бы начать это отладить значения: pxWidth, pxHeight и appWidgetId в String fileName = cacheBaseName(appWidgetId) + "_" + pxWidth + "x" + pxHeight + ".png";

Integer.valueOf означает, что он, вероятно, пытается разобрать строку в междунар, пример: String «13» в межд 13.

Из этих трех переменных наиболее вероятным является appWidgetId, так как есть еще один отзыв о getAppWidgetId. Но, конечно, запишите все 3! =)

0

Я согласен с другими,

Обычно с отчетами о сбоях, вы хотите посмотреть, за исключением, в этом случае NumberFormatException, а затем для вашего имени пакета класса.

Предполагая, что ваш пакет com.cloud3squared.meteogram., проблема связана с вашей службой метеограммы, и вы используете Integer.parseInt() неправильно.

Обратите внимание, что для Integer.parseInt() вам понадобится строка с номером в нем, например, «3» или «5». Если он не имеет этого, метод будет сбой с NumberFormatException. Я не вижу этот вызов метода в вашем классе cacheFileName(), поэтому я рекомендую вам искать через getAppWidgetID() и другие вызовы методов через трассировку стека.

Смежные вопросы