10

我正在尝试根据用户提交的崩溃报告追踪错误的来源,并得出结论,我需要一些关于如何解释崩溃报告的基本培训。

例如,崩溃报告如下:

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但里面没有任何东西可能导致这样的异常......将 a 解析为Stringanint发生在此之前......解析的 int 只是传递给cacheFileName.

感激地收到任何帮助。

编辑

更多代码片段可在下面的评论中参考:

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;
}
4

4 回答 4

3

错误在MeteogramService.java文件中。

该错误NumberFormatException是由于 int 值无效,这可能是因为将字符串或无效变量传递给 int。

类名或方法名的列表是从上到下访问变量的顺序。验证您是否正在传递一个 int,如果它是用户定义的值,则使用 try/catch 块并在输入非 int 值时显示 toast。

于 2016-08-31T06:18:23.810 回答
3

您必须从上到下和从下到上阅读它。

它通常从顶部更具体到底部更广泛。

从顶部:您将找到异常的确切原因

在这种情况下,java.lang.NumberFormatException哪个在cacheFileName's爆炸cacheBaseName

从底部:您会发现问题的一般区域

GetServerWidgetAsyncTask.onPostExecute

在我看来,这可能是在 AsyncTask 中的后台工作中完成的某些值的格式不正确并在 onPostExecute 中用作 int。

我要开始的地方是调试:pxWidthpxHeightappWidgetIdinString fileName = cacheBaseName(appWidgetId) + "_" + pxWidth + "x" + pxHeight + ".png";

Integer.valueOf表示它可能试图将字符串解析为 int,例如:String "13" into int 13。

在这 3 个变量中,最可能的关系是 ,appWidgetId因为还有一个关于 的提示getAppWidgetId。但可以肯定的是,记录所有 3 个!=)

于 2016-09-02T17:09:02.620 回答
2

这是否显示导致 NumberFormatException 的调用顺序

是的,这个堆栈跟踪肯定会向您显示导致异常的调用顺序。从下到上阅读您的堆栈跟踪以了解方法调用的顺序 -

嵌套在 MeteogramService 中的访问是什么?...该类中没有访问方法

这些访问方法是自动生成的方法,用于从内部类访问外部类的成员。有关更多详细信息,请查看 Jake Wharton 的此视频

如何确定 NumberFormatException 实际发生在哪个函数中

检查堆栈跟踪中的所有方法调用。最上面的会告诉您首先从哪个方法抛出异常。因此,如果您检查堆栈跟踪,则第 2 到第 4 行中的方法调用来自 Integer.java 类,该类不是您定义的类,但异常是从该类启动的。现在如果你来到第 5 行,它清楚地告诉你下一个方法调用是MeteogramService.cacheFileName(). 因此,当您尝试使用此方法执行某些操作时,就会出现异常。

那里没有任何东西可能导致这种异常

仔细阅读您的堆栈跟踪。在第一行它说java.lang.NumberFormatException: Invalid int: ""。这意味着您将空字符串或“”传递给整数类。现在,如果您在MeteogramService.cacheFileName()它说java.lang.Integer.valueOf()方法已被您调用之前检查该行。

因此,结论是您正在调用 valueOf() 方法并且空字符串不是有效的整数,因此NumberFormatException

于 2016-09-01T04:09:41.873 回答
0

我同意其他人,

通常对于崩溃报告,您要查找异常,在本例中为 a NumberFormatException,然后查找您的类包名称。

假设您的包裹是com.cloud3squared.meteogram.,问题出在您的 Meteogram Service 并且您使用Integer.parseInt()错误。

请注意,对于Integer.parseInt(),您需要一个包含数字的字符串,例如“3”或“5”。如果它没有这个,该方法将崩溃并带有NumberFormatException. 我在您的类中没有看到该方法调用,cacheFileName()因此我建议您通过堆栈跟踪搜索 getAppWidgetID() 和其他方法调用。

于 2016-09-03T13:45:52.873 回答